note.nkmk.me

Python, Pillowで画像を一括リサイズ(拡大・縮小)

Date: 2017-02-16 / tags: Python, Pillow, 画像処理, 自動化
スポンサーリンク

Pillowを使って画像をリサイズする

画像処理ライブラリPillow(PIL)のImageモジュールに、画像をリサイズ(拡大・縮小)するメソッドresize()が準備されている。

Image.resize(size, resample=0)
Returns a resized copy of this image.
Image Module — Pillow (PIL Fork) 4.0.0 documentation

Pillow(PIL)のインストール、基本的な使い方などは以下の記事参照。

拡大・縮小ではなく、画像の一部を切り出してサイズを小さくする場合は、crop()を使う。

Image.resize()の使い方

引数sizeには、リサイズ後のサイズを(width, height)のようにタプルで指定する。

引数resampleには、リサンプリングする際に使われるフィルターを指定する。以下の6種類がある。省略した場合はデフォルトでNEARESTが使われる。

Filters
- NEAREST
- BOX
- BILINEAR
- HAMMING
- BICUBIC
- LANCZOS
Concepts — Pillow (PIL Fork) 4.0.0 documentation

下のもの(BICUBICとかLANCZOS)ほど処理に時間はかかるが、品質は高い。

from PIL import Image

img = Image.open('data/src/lena_square.png')

img_resize = img.resize((256, 256))
img_resize.save('data/dst/lena_pillow_resize_nearest.jpg')

img_resize_lanczos = img.resize((256, 256), Image.LANCZOS)
img_resize_lanczos.save('data/dst/lena_pillow_resize_lanczos.jpg')

引数のresampleを省略しNEARESTフィルターで縮小した画像(左)と、LANCZOSフィルターで使った画像(右)。

Pillow resize Nearest Pillow resize Lanczos

上の例では、リサイズ後の画像サイズを(256, 256)というように決め打ちしているが、元画像のサイズをもとに指定したい場合は、例えば以下のようにする。

img_resize = img.resize((int(img.width / 2), int(img.height / 2)))
img_resize_lanczos.save('data/dst/lena_pillow_resize_half.jpg')

サイズは整数で指定する必要があるため、int()を使っている。

一括で処理する

画像の処理も、以前に書いたファイル名の一括変換とほぼ同じ要領でできる。

以下は、ファイルの後ろに文字列を追加するコードの例。

import os
import glob

files = glob.glob('./dir/*.jpg')

for f in files:
    ftitle, fext = os.path.splitext(f)
    os.rename(f, ftitle + '_img' + fext)

これにPillowによる画像処理を加えるだけ。

import os
import glob
from PIL import Image

files = glob.glob('./dir/*.jpg')

for f in files:
    img = Image.open(f)
    img_resize = img.resize((int(img.width/2), int(img.height/2)))
    ftitle, fext = os.path.splitext(f)
    img_resize.save(ftitle + '_half' + fext)

簡単!

スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事