Pythonで画像編集を自動化する

f:id:Medicmed:20180630063453j:plain

Pillowという画像処理モジュールを使用する

pythonで画像操作を行うには、Pillowというサードパーティ製モジュールを使用します。
Pillowのモジュール名はPILであり、これはPython Image Libraryという古いモジュールとの後方互換性のためみたいです。
Pillowをインポートする時は「from Pillow import 」ではなく「from PIL import 」の形式で行います。
今回メインで使用する画像はフリー素材で取ってきた「ありがとう猫」です。

イラストボックス – ありがとう猫イラスト無料素材 – Powered by LINE

f:id:Medicmed:20180630073727j:plain

基本操作

画像サイズやフォーマットの確認、画像の切り抜きなどの基本操作をしていきます。

画像の大きさやフォーマットの確認
>>> from PIL import Image
>>> cat = Image.open('cat.jpg')
>>> cat.size
(581, 640)
>>> width,height = cat.size
>>> width
581
>>> height
640
>>> cat.filename
'cat.jpg'
>>> cat.format
'JPEG'

読み込んだ画像の大きさや、フォーマットを表示することができます。

画像を切り抜く

Imageオブジェクトのcrop()を使用すると、切り抜いた画像を表すImageオブジェクトを返してくれます。
切り抜き操作は「インプレース」ではないので、新しいImageオブジェクトを返すことになります。

>>> crop_cat = cat.crop((100,100,400,400))
>>> crop_cat.save('cropped.png')
切り抜いた画像

f:id:Medicmed:20180630073713p:plain

空白の画像を作成する

Image.new()関数を使用すると、空白の画像を返してくれます。

>>> im = Image.new('RGBA',(800,800))
>>> im.save('empty.png')

カラーモードをRGBAにして、サイズを800×800にしています。
この画像に先程切り抜いた画像を敷き詰める操作をします。

切り抜いた画像を敷き詰める
>>> cat_width,cat_height = cat.size
>>> crop_cat_width,crop_cat_height = crop_cat.size
>>> cat_copy = cat.copy()
>>> for left in range(0, cat_width, crop_cat_width):
...     for top in range(0, cat_height, crop_cat_height):
...         print(left,top)
...         cat_copy.paste(crop_cat, (left,top))
...
0 0
0 300
0 600
300 0
300 300
300 600
>>> cat_copy.save('tiled.png')
切り抜いた画像を敷き詰めた

f:id:Medicmed:20180630075248p:plain

画像サイズを変更する

画像サイズを変更するには、resize()を使用します。
指定した幅と高さにサイズを変更してくれます。
ただ、「画像の縦横比」を維持したまま、サイズ縮小したい場合はthumbnail()を使う方が良いです。
引数は最大の幅と高さを表す2つの整数のタプルで、画像が指定サイズを上回る場合には、ちょうど収まるように縮小してくれます。

>>> thumb_im = crop_cat.copy()
>>> thumb_im.size
(300, 300)
>>> thumb_im.thumbnail((100,100))
>>> thumb_im.size
(100, 100)
>>> thumb_im.save('thumbnail.png')

元のサイズが300×300だったので100×100に変更しました。

サイズ変更した画像

f:id:Medicmed:20180630081615p:plain

フォルダ内のすべての画像にロゴを追加する

指定したフォルダ内にある画像にロゴを追加するプログラムを作成します。

完成したプログラムはコチラ!
import os,sys
from PIL import Image
path = input("フォルダを指定してください \n:")
logo = input("ロゴ画像を指定してください \n:")
size = input("画像サイズを指定してください \n:")
print('='*6 + 'Order' + '='*6)
print("指定したフォルダ:" + file)
print("指定した画像:" + image)
print("画像サイズ:" + size)
logo_im = Image.open(logo)
logo_width, logo_height = logo_im.size
os.chdir(path)
os.makedirs('withlogo', exist_ok=True)
for filename in os.listdir(base + dir) :
if not (filename.lower().endswith('.png') or filename.lower().endswith('.jpg')) :
continue
im = Image.open(filename)
im.thumbnail((size,size))
width,height = im.size
print("Now Adding the logo"{}...".format(filename))
    im.paste(logo_im,(width-logo_width,height-logo_height),logo_im)
    im.save(os.path.join('withlogo',filename)
print("="*6 + "DONE" + "="*6)

適当な画像フォルダを作成します。
名前を「sample_pictures」にしておきます。
f:id:Medicmed:20180630093205p:plain
JPEGがないけど、まぁいいや()

Pythonを起動させる!

手順としては
①フォルダを指定
②ロゴ画像を指定
③作成する画像サイズを指定
です。
今回作成する画像のサイズは400×400としました。

python logo.py
フォルダを指定してください
:/home/medi/Desktop/sample_pictures
ロゴ画像を指定してください
:/home/medi/Downloads/thumbnail.png
画像サイズを指定してください
:400
======Order======
指定したフォルダ:/home/medi/Desktop/sample_pictures
指定した画像:/home/medi/Downloads/thumbnail.png
画像サイズ:400
Now Adding the logoFigure_1-4.png...
Now Adding the logoFigure_1.png...
Now Adding the logoFigure_1-3.png...
Now Adding the logoFigure_1-2.png...
Now Adding the logoFigure_1-5.png...
Now Adding the logoFigure_1-1.png...
Now Adding the logodep_num.png...
Now Adding the logo医師数.png...
======DONE======

上手く実行することができました。

完成した画像

f:id:Medicmed:20180630103753p:plain

sample_picturesフォルダに新しくwithlogoフォルダが作成されています。
中身を確認すると、すべての画像右下にthumbnail.pngの画像がちゃんと追加できています。

ぜひ参考にしてみてください。
終わり。

今回参考にした書籍はコチラ!

退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング

退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング

Udemyというオンライン学習サイトで、Al-Sweigart本人の授業を受けることもできます。
英語なので初めてPythonを勉強する方にはハードルが高いかもしれないので、まずは日本語のPython講座を受講して雰囲気を掴むことをオススメします。
「Automate the Boring Stuff with Python」では、コンプリヘンションやクラスについては取り扱っていません。
あくまでも「ノンプラグラマーが仕事で役立つプログラミングスキル」にフォーカスしているため、敷居は低いと思います。

youtu.be

自分は受講しましたが、やっぱり英語クラスで有名な人の授業は面白く大変勉強になります。
英語のオンライン授業の方が圧倒的に質が高い場合が多いですので、この機会にぜひトライしてみるのもアリかもです!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください