Python Tips: 画像を指定のサイズに切り取りたい

Python を使って画像の一部を切り出して保存する方法をご紹介します。

Python 3 の場合は Python 2 で有名な画像処理ライブラリ PIL のフォークである Pillow を使う形がシンプルでかんたんです。

PIL の Image.open() で元画像を取得して、 crop() メソッドに切り出し場所の座標を渡すと画像を切り出せます。あとは save() で別ファイルとして保存すれば OK です。

from PIL import Image

infile = '01.jpg'
outfile = 'out-01.jpg'
area = (left, top, right, bottom)

img = Image.open(infile)
cropped_img = img.crop(area)
cropped_img.save(outfile)

例えば、画像の中心を切り出す場合のサンプルコードは次のようになります。

# coding: utf-8

"""画像の中心部分を指定されたサイズ切り取った画像を生成する
"""

from pathlib import Path
from PIL import Image

crop_info = (
  # 画像 01.jpg は横 200px - 縦 100px で切り出す
  ('01.jpg', 200, 100),
  # 画像 02.jpg は横 300px - 縦 500px で切り出す
  ('02.jpg', 300, 500),
)

def main():
    print('started.')
    crop_images(crop_info, 'out-')
    print('finished.')

def crop_images(crop_info, prefix):
    for infile, width, height in crop_info:
        path = Path(infile)
        outfile = prefix + path.name
        crop_image(infile, outfile, width, height)

def crop_image(infile, outfile, width=None, height=None):
    img = Image.open(infile)

    width_orig, height_orig = img.size
    if not width:
        width = width_orig
    if not height:
        height = height_orig

    center_h = width_orig / 2
    center_v = height_orig / 2
    width_half = width / 2
    height_half = height / 2

    # 中心の切り出し場所の座標を計算する
    left = center_h - width_half
    top = center_v - height_half
    right = center_h + width_half
    bottom = center_v + height_half
    area = (left, top, right, bottom)

    cropped_img = img.crop(area)
    cropped_img.save(outfile)

if __name__ == "__main__":
    main()

このスクリプトを実行すると、 01.jpg が次のような画像だった場合・・・

01

Photo by Terry zhouCC BY-NC-SA

次のような横 200px 、縦 100px の画像 out-01.jpg が生成されます。

out 01

メソッド名なども直感的でわかりやすく便利ですね。