【pythonista3】Pillowモジュールで画像を編集する(切り取りと枠の挿入)メソッドの使用例9選
pythonスクリプトでjpgやpmgなどの画像を加工、作成することが出来る。
簡単な画像処理にPillowモジュールが使われる。このモジュールは、読み込んだ画像をもとに新たな画像の作成、保存が出来る。
iOSアプリのpythonista3には標準でこのモジュールがあるがver1.1.7と古い。(2020年3月アップデート版現在。)
pythonista3内でPillowモジュールが出来ることを紹介する。
以下では、次の2つの操作を説明する。
- 切り取り
- 拡張(枠線を付け足す)
使用環境
- ハード: iPad第6世代
- OS: iOS13.4.1 (17E262)
- 開発環境:pythonista3 app
- python ver 3.6.1
- モジュール Pillow ver 1.1.7
使っているアプリの都合上、Pillowモジュールが古い。そのため関数の引数など現在の仕様が若干異なる場合がある。
Pythonista3では最初からPillowモジュールが入っているためインストールは必要がない。
使い方
お借りした画像のリソース
以下では、次の画像をベースに説明する。
上の画像をsample.jpg
とする。
切り取り
範囲を指定して切り取り
例1
Image
オブジェクトのcrop
メソッドを使う。引数に、画像より狭い範囲を指定すると切り取りが出来る。
- 実行結果
from PIL import Image # 画像読み込み img=Image.open('sample.jpg') # サイズ取得 w,h=img.width,img.height # 切り取りサイズ指定 box=map(int,(w*0.3,h*0.08,w*0.7,h*0.45)) out=img.crop(box) # 画像を保存 out.save('pillow-crop-1.png')
- メソッドの解説
Imageオブジェクト.crop((左,上,右,下))
crop
メソッドは引数にタプルを取る。タプルには整数4つが入る。それぞれ切り取る範囲の左端、上端、右端、下端のピクセル数を指定する。
例2
切り取った後,Image
オブジェクトのresize
メソッドでリサイズする。
- 実行結果
from PIL import Image # 画像読み込み img=Image.open('sample.jpg') # サイズ取得 w,h=img.width,img.height # 切り取りサイズ指定 box=map(int,(w*0.3,h*0.08,w*0.7,h*0.45)) part=img.crop(box) # 切り取った後リサイズ out=part.resize((part.width*4,part.height*4)) # 画像を保存 out.save('pillow-crop-3.png')
- 解説
画像オブジェクトには、幅と高さを取得出来るプロパティがある。
画像オブジェクト.width # 画像の幅 画像オブジェクト.height # 画像の高さ
Image
オブジェクトのresize
メソッドは、幅と高さのタプルを引数に取る。
画像オブジェクト.resize((幅,高さjj
幅と高さをそれぞれ元の画像の幅と高さを使った値にすると縦横比を維持できる。
端を切り取り
例3
ImageOps
モジュールのcrop
関数を使って、画像の端を切り取り出来る。
- 実行結果
from PIL import Image,ImageOps # 画像読み込み img=Image.open('sample.jpg') # 端を切り取り out=ImageOps.crop(img,border=20) # 画像を保存 out.save('pillow-crop-4.png')
- 解説
crop
関数は第一引数に画像オブジェクト、第二引数に切り取るピクセル数を指定する。
ImageOps.crop(画像オブジェクト,border=切り取りピクセル数)
例4
ImageOps
モジュールのexpand
関数の引数をマイナスにすろと切り取りになる。
- 実行結果
from PIL import Image,ImageOps # 画像読み込み img=Image.open('sample.jpg') # 引数をマイナスにすろと切り取りになる out=ImageOps.expand(img,border=-20) # 画像を保存 out.save('pillow-expand-1.png')
- 解説
expand
関数は第一引数に画像オブジェクト、第二引数に広げるピクセル数を指定する。
ImageOps.expand(画像オブジェクト,border=拡張ピクセル数)
中心と縦横比を指定する
例5
ImageOps
モジュールのfit
関数で、切り取る範囲の縦横比と中心点を指定して切り取ることが出来る。
- 実行結果
from PIL import Image,ImageOps # 画像読み込み img=Image.open('sample.jpg') # 中心を指定して四角く切り取り out=ImageOps.fit(img,(250,150),centering=(0.5,0.1)) # 画像を保存 out.save('pillow-crop-6.png')
- 解説
fit
関数は引数で出力画像の縦横比と中心を指定する。その縦横比を満たす最大の大きさの範囲を元画像から切り取る。
ImageOps.fit(画像オブジェクト,(縦の比,横の比),centering=(中心のx座標,中心のy座標))
例6
縦横比を同じにすると正方形の画像に出来る。
- 実行結果
from PIL import Image,ImageOps # 画像読み込み img=Image.open('sample.jpg') # 中心を指定して四角く切り取り out=ImageOps.fit(img,(500,500),centering=(0.5,0.2)) # 画像を保存 out.save('pillow-crop-7.png')
枠線付け
例7
ImageOps
モジュールのexpand
関数で画像を広げて枠線を付け足すことが出来る。上で解説した引数に加えて、fill
引数を追加して、枠線の色を指定出来る。
青い枠線を付け足す。
- 実行結果
from PIL import Image,ImageOps # 画像読み込み img=Image.open('sample.jpg') # 青色で枠線を付け足す out=ImageOps.expand(img,border=20,fill=(0,0,255)) # 画像を保存 out.save('pillow-expand-2.png')
例8
Image
オブジェクトのcrop
メソッドの引数に、元の画像より広い範囲を指定するとはみ出た部分を黒く塗った画像が生成される。
- 実行結果
from PIL import Image # 画像読み込み img=Image.open('sample.jpg') # サイズ取得 w,h=img.width,img.height # 切り取りサイズ指定 box=map(int,(w*-0.3,h*-0.1,w*1.3,h*1.1)) out=img.crop(box) # 画像を保存 out.save('pillow-crop-2.png')
例9
ImageOps
モジュールのcrop
関数の引数をマイナスにするとexpand
関数のように拡張出来る。塗り潰しの色は黒のみである。
- 実行結果
from PIL import Image,ImageOps # 画像読み込み img=Image.open('sample.jpg') # 端を切り取り、引数をマイナスにすろと余白を作る out=ImageOps.crop(img,border=-20) # 画像を保存 out.save('pillow-crop-5.png')
まとめ
Image
,ImageOps
モジュールで次のような画像の加工ができる。
Image
オブジェクトのcrop
メソッド:端の位置を指定して切り取るImageOps
モジュールのcrop
関数:画像の端を切り取る。ImageOps
モジュールのfit
関数:縦横比と中心点を指定して切り取るImageOps
モジュールのexpand
関数:画像を広げて枠線を付け足す