2021年12月11日土曜日

【Pillow】ImageOps.fitによる指定サイズでの画像切り出し

画像処理ライブラリPillowのPIL.ImageOpsモジュールのImageOps.fitにより指定したサイズでの画像切り出しができる。
Pillow(PIL)を使うためにはインポートが必要。PIL.ImageOpsモジュールは通常以下の形式でインポートされる。

from PIL import ImageOps

例に用いる画像'ushi.jpg'は以下を使用(フリー写真素材ぱくたそより)。画像サイズは幅600高さ400ピクセル。






1. 書式

fit の書式は以下の通り。

PIL.ImageOps.fit(image, size, method=3, bleed=0.0, centering=(0.5, 0.5))
引数 意味
image 元画像
size 処理後の画像サイズを(width, height)のピクセル数で指定。処理後のアスペクト比が元画像より横長の場合には、元画像の縦方向がクロップされた画像となる。処理後のアスペクト比が元画像より縦長の場合には、元画像の横方向がクロップされた画像となる。
method オプション。拡大縮小時の画像補完方式。デフォルトの3はPIL.Image.BICUBICが指定される。
bleed オプション。画像の四方をカットする割合。デフォルトは0(カットなし)。1%カットする場合は0.01、10%カットする場合は0.1と指定。
centering オプション。切り出す際の中心位置の指定。デフォルトの(0.5, 0.5)で画像の中心が指定される。


2. sizeの指定

引数sizeには処理後の画像サイズを(width, height)のピクセル数のタプルで指定する。

600x400の元画像に対してsize=(200, 100)としてfitする例。元画像に対して変更後の画像が横長となるため、元画像の上下が切り取られた上で指定サイズに縮小される。

from PIL import Image, ImageOps

im = Image.open('ushi.jpg')  
im_fit = ImageOps.fit(im, (200, 100))
im_fit.save('ushi_fit.jpg')

実行結果





600x400の元画像に対してsize=(100, 200)としてfitする例。元画像に対して変更後の画像が縦長となるため、元画像の左右が切り取られた上で指定サイズに縮小される。

from PIL import Image, ImageOps

im = Image.open('ushi.jpg')  
im_fit = ImageOps.fit(im, (100, 200))
im_fit.save('ushi_fit.jpg')

実行結果





3. bleedの指定

bleedで指定した割合だけ画像の四方がカットされる。1%カットする場合0.01、10%カットする場合0.1と指定する。

bleed=0の場合(指定しない場合と同じ)。

from PIL import Image, ImageOps

im = Image.open('ushi.jpg')  
im_fit = ImageOps.fit(im, (100, 200), bleed=0)
im_fit.save('ushi_fit.jpg')

実行結果





bleed=0.1の場合。上下左右10%カットされた上でsizeで指定した100x200ピクセルに切り出される。

from PIL import Image, ImageOps

im = Image.open('ushi.jpg')  
im_fit = ImageOps.fit(im, (100, 200), bleed=0)
im_fit.save('ushi_fit.jpg')

実行結果





4. centeringの指定

centeringにより切り出し位置が指定できる。デフォルトは(0.5, 0.5)で元画像の中心となる。元画像に対して変更後の画像が縦長となる場合は、元画像の左右に余地があるため幅方向の指定が有効、元画像に対して変更後の画像が横長となる場合は、元画像の上下に余地があるため高さ方向の指定が有効となる。

centering指定なし。

from PIL import Image, ImageOps

im = Image.open('ushi.jpg')  
im_fit = ImageOps.fit(im, (200, 100))
im_fit.save('ushi_fit.jpg')

実行結果





centering=(0, 0)と指定した場合。幅0高さ0で画像の左上角が指定されるが、縦長に切り抜いており高さ方向は余地がないため幅方向のみ左端の指定が有効となる。

from PIL import Image, ImageOps

im = Image.open('ushi.jpg')  
im_fit = ImageOps.fit(im, (200, 100), centering=(0, 0))
im_fit.save('ushi_fit.jpg')

実行結果





centering=(1, 0)と指定した場合。幅1高さ0で画像の右上角が指定されるが、縦長に切り抜いており高さ方向は余地がないため幅方向のみ右端の指定が有効となる。

from PIL import Image, ImageOps

im = Image.open('ushi.jpg')  
im_fit = ImageOps.fit(im, (200, 100), centering=(1, 0))
im_fit.save('ushi_fit.jpg')

実行結果





5. リファレンス

Pillow (PIL Fork) > ImageOps Module > PIL.ImageOps.fit(image, size, method=3, bleed=0.0, centering=(0.5, 0.5))

使用バージョン:Python 3.8.8 / Pillow 8.2.0

0 件のコメント:

コメントを投稿