【pythonista3】Pillowモジュールで画像を編集する(画像の貼り付け)メソッドの使用例9選
pythonスクリプトでjpgやpmgなどの画像を加工、作成することが出来る。
簡単な画像処理にPillowモジュールが使われる。このモジュールは、読み込んだ画像をもとに新たな画像の作成、保存が出来る。
iOSアプリのpythonista3には標準でこのモジュールがあるがver1.1.7と古い。(2020年3月アップデート版現在。)
pythonista3内でPillowモジュールが出来ることを紹介する。
以下では、次の5つの操作を説明する。
- 図形を貼り付け
- 文字を貼り付け
- 画像を貼り付け
- 画像の混合
- 画像を並べる
使用環境
- ハード: iPad第6世代
- OS: iOS13.4.1 (17E262)
- 開発環境:pythonista3 app
- python ver 3.6.1
- モジュール Pillow ver 1.1.7
使っているアプリの都合上、Pillowモジュールが古い。そのため関数の引数など現在の仕様が若干異なる場合がある。
Pythonista3では最初からPillowモジュールが入っているためインストールは必要がない。
使い方
お借りした画像のリソース
以下では次の2つの画像を使う。
上の画像をsample.jpg
とする。
この画像をsmp.jpg
とする。
以下のマスク画像を使う。
この画像をmask2.png
とする。
図形を貼り付け
例1
画像に図形を貼り付ける。
- 実行結果
from PIL import Image,ImageDraw # 画像オブジェクト生成 img=Image.open('sample.jpg') base=Image.new('RGB',img.size,(128,128,128)) # 描画オブジェクト生成 draw=ImageDraw.ImageDraw(base) # 貼り付け base.paste(img) x,y,r=10,10,50 w=int(img.width) # 図形を貼り付け draw.rectangle((x,y,x+r,y+r),fill=(0,0,255),outline=(0,255,255)) draw.ellipse((w-x-r,y,w-x,y+r),fill=(255,0,0),outline=(255,255,0)) # 画像を保存 base.save('pillow-paste-1.png')
- 解説
図形の貼り付けはImageDraw
オブジェクトのrectangle
,ellipse
メソッドを使う。
メソッドの引数は次のようになる。fill
引数は塗り潰し、outline
引数は枠線の色を指定する。
描画オブジェクト.rectangle((左端のx座標,上端のy座標,右端のx座標,下端のy座標),fill=(R成分,G成分,B成分),outline=(R成分,G成分,B成分))
ellipse
メソッドも同様の引数をとる。
手順は以下のようになる。
- 画像を読み込む
- 画像オブジェクト(
img
)に描画オブジェクト(draw
)を作る - 描画オブジェクトに図形を貼り付ける
- 画像オブジェクトを保存する
保存するのはdraw
ではなくimg
であることに注意する。
画像を貼り付け
例2
画像に別の画像を張り付ける。
- 実行結果
from PIL import Image # 画像オブジェクト生成 base=Image.open('sample.jpg') img=Image.open('smp.jpg') # リサイズ paste=img.resize((img.width//5,img.height//5)) # 貼り付け base.paste(paste,(10,10)) # 画像を保存 base.save('pillow-paste-2.png')
- 解説
Image
オブジェクトのpaste
メソッドを使う。
引数で張り付ける座標を指定出来る。
output = Imageオブジェクト.paste(張り付ける画像オブジェクト,(x座標,y座標))
例3
貼り付けた那像のはみ出した部分は切り捨てられる。
- 実行結果
from PIL import Image # 画像オブジェクト生成 base=Image.open('sample.jpg') img=Image.open('smp.jpg') # リサイズ paste=img.resize((img.width//3,img.height//3)) # 貼り付け base.paste(paste,(-30,20)) # 画像を保存 base.save('pillow-paste-3.png')
例4
マスク画像を使う。
- 実行結果
from PIL import Image,ImageOps # 画像オブジェクト生成 base=Image.open('sample.jpg') img=Image.open('smp.jpg') # リサイズ paste=img.resize((img.width//5,img.height//5)) mask=Image.open('mask2.png') mask=ImageOps.invert(mask.resize(paste.size).convert('L')) # 貼り付け base.paste(paste,(10,10),mask) # 画像を保存 base.save('pillow-paste-4.png')
- 解説
マスク画像を使って画像を張り付けることも出来る。
マスク画像のサイズは元の画像と合わせる。
output = Imageオブジェクト.paste(張り付ける画像オブジェクト,(x座標,y座標),mask=マスク画像)
画像を混ぜる
例5
2つの画像を割合を指定して混ぜ合わせる。
合成前に画像のサイズを合わせておく。
- 実行結果
from PIL import Image # 画像読み込み img1=Image.open('sample.jpg') img2=Image.open('smp.jpg') # サイズを合わせる img3=img2.resize(img1.size) # 混ぜる out=Image.blend(img1,img3,0.4) # 画像を保存 out.save('pillow-mix-1.png')
- 解説
Image
オブジェクトのblend
メソッドを使う。
引数を次のように指定する。
out=Image.blend(image1,image2,mask)
mask=0
の場合はimage2になり、mask=1
の場合はimage1になる。それ以外の値ではmask
の数値に応じた割合で合成する。
例6
2つの画像をマスク画像を利用して混ぜ合わせる。
合成前に画像のサイズを合わせておく。
- 実行結果
from PIL import Image # 画像読み込み img1=Image.open('sample.jpg') img2=Image.open('smp.jpg') # サイズを合わせる img3=img2.resize(img1.size) maskimg=Image.open('mask2.png') # サイズを合わせる mask=maskimg.resize(img1.size) # マスクを使って合成 out=Image.composite(img1,img3,mask) # 画像を保存 out.save('pillow-mix-2.png')
- 解説
Image
オブジェクトのcomposite
メソッドを使う。
引数を次のように指定する。
out=Image.composite(image1,image2,mask)
マスク画像はグレースケールの画像を使う。マスク画像のピクセルが黒の場合はimage2になり、白の場合はimage1になる。それ以外の値ではグレーの度合いに応じた割合で合成する。
画像を並べる
例7
画像を縦に並べる。
- 実行結果
from PIL import Image # 画像を読み込む img1=Image.open("sample.jpg") img2=Image.open("smp.jpg") # サイズを決める w=img2.width*img1.height/img2.height h=img1.height # ベースの画像を用意 img=Image.new("RGB",(img1.width,img1.height+h),(0,0,0)) # 貼り付け img.paste(img1,(0,0)) img.paste(img2,(0,img1.height)) # 保存 img.save('pillow-paste-5.png')
- 解説
手順は以下のようになる。
- 2つの画像を読み込む
- 画像のサイズを調整する
- 2つの画像がぴったり収まる画像オブジェクトを生成する
- 1つ目の画像を生成した画像に張り付ける
- 左上(座標=(0,0))に張り付ける
- 2つ目の画像を生成した画像に張り付ける
- 1つ目の画像の下(座標=(0,1つ目の画像の高さ))に張り付ける
- 生成した画像を保存する
例8
画像を横に並べる。
- 実行結果
from PIL import Image # 画像を読み込む img1=Image.open("sample.jpg") img2=Image.open("smp.jpg") # サイズを決める w=img1.width h=img2.height*img1.width/img2.width # ベースの画像を用意 img=Image.new("RGB",(img1.width+w,img1.height),(0,0,0)) # 貼り付け img.paste(img1,(0,0)) img.paste(img2,(img1.width,0)) # 保存 img.save('pillow-paste-6.png')
- 解説
手順は以下のようになる。
- 2つの画像を読み込む
- 画像のサイズを調整する
- 2つの画像がぴったり収まる画像オブジェクトを生成する
- 1つ目の画像を生成した画像に張り付ける
- 左上(座標=(0,0))に張り付ける
- 2つ目の画像を生成した画像に張り付ける
- 1つ目の画像の右(座標=(1つ目の画像の幅,0))に張り付ける
- 生成した画像を保存する
文字を貼り付け
例9
画像に文字を貼り付ける。
- 実行結果
from PIL import Image,ImageDraw,ImageFont # 画像オブジェクト生成 img=Image.open('smp.jpg') base=Image.new('RGB',(img.size),(128,128,128)) # 描画オブジェクト生成 draw=ImageDraw.ImageDraw(img) # 貼り付け base.paste(img) # フォントオブジェクト生成 font=ImageFont.truetype("ipag.ttf",20) # 文字を貼り付け draw.multiline_text((10,50),'レオナルド\nダ\nヴィンチ',fill=(0,0,255),font=font,spacing=30) # 画像を保存 img.save('pillow-paste-7.png')
- 解説
文字の貼り付けはImageDraw
オブジェクトのmultiline_text
メソッドを使う。
メソッドの引数は次のようになる。
描画オブジェクト.multiline_text((x座標,y座標),文字列,fill=(R成分,G成分,B成分),font=フォントオブジェクト,align=文字の構え,spacing=改行幅)
- 座標:文字の左上の座標を指定する
- (中央ではない)
- 文字列:改行も含めることが出来る
fill
引数は文字の色を指定するalign
引数は文字の構えを指定するalign='center'
:中央構えalign='left'
:左構えalign='right'
:右構え
spacing
引数は改行の幅をピクセル単位で指定する
フォントオブジェクトはフォントと文字のサイズを指定する。 文字のサイズはフォントオブジェクトで指定することに注意する。 日本語を表示させるには日本語のフォントを使う。
変数=ImageFont.truetype(フォント名,文字サイズ)
手順は以下のようになる。
- 画像を読み込む
- 画像オブジェクト(
img
)に描画オブジェクト(draw
)を作る - フォントオブジェクトを生成する
- 描画オブジェクトに文字を貼り付ける
- 画像オブジェクトを保存する
まとめ
Image
オブジェクト、imageDraw
オブジェクトのメソッドを使って次のような画像の合成が出来る。
Image
オブジェクトpaste
メソッド- 座標を指定する
- マスク画像を指定する
blend
メソッド- 全体を混ぜる
composite
メソッド
- マスク画像を使って混ぜる
ImageDraw
オブジェクト- 図形を貼り付ける
- 文字を貼り付ける