コードDE描画

プログラミングで図を描く練習

【pythonista3】Pillowモジュールで画像を編集する(切り取りと枠の挿入)メソッドの使用例9選

pythonスクリプトでjpgやpmgなどの画像を加工、作成することが出来る。

簡単な画像処理にPillowモジュールが使われる。このモジュールは、読み込んだ画像をもとに新たな画像の作成、保存が出来る。

iOSアプリのpythonista3には標準でこのモジュールがあるがver1.1.7と古い。(2020年3月アップデート版現在。)

pythonista3内でPillowモジュールが出来ることを紹介する。

以下では、次の2つの操作を説明する。

  • 切り取り
  • 拡張(枠線を付け足す)

使用環境

使っているアプリの都合上、Pillowモジュールが古い。そのため関数の引数など現在の仕様が若干異なる場合がある。

Pythonista3では最初からPillowモジュールが入っているためインストールは必要がない。

使い方

お借りした画像のリソース

以下では、次の画像をベースに説明する。

sample.jpg
sample.jpg

上の画像を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関数の引数をマイナスにすろと切り取りになる。

  • 実行結果

expand関数の引数をマイナス
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関数のように拡張出来る。塗り潰しの色は黒のみである。

  • 実行結果

crop関数で拡張した画像
crop関数で拡張した画像

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関数:画像を広げて枠線を付け足す

参考リンク