JPG画像ファイルのサムネイルをPythonで生成

JPG画像のサムネイルを作成する処理をPythonで書きました。

Pillowというライブラリで画像ファイルを扱えます。もともとはPILというライブラリがあったのですが、PILはPython 2までしかサポートしておらず、PILからフォークしたPillowがいまのデファクトという経緯のようです。

Pillow — Pillow (PIL Fork) 8.1.0 documentation

ライブラリをインストール。

$ pip install pillow

サンプルコードです。

import io

# Pillowをインポート
import PIL.Image

# 元画像のJPEGバイナリのバイト配列
originalBinary = ...

# JPEGのバイト配列から画像のインスタンスを生成
image = PIL.Image.open(io.BytesIO(originalBinary))

# サムネイルの最大サイズ
width = 200
height = 200
# 長いほうの辺が指定のサイズになる
# 縦横比は維持されるため、元画像が正方形でない限り短い辺はこれよりも小さくなる

# 2021/01/22追記
# 以下のコードを実行すれば、上記サイズは最大ではなく最小サイズの指定に変わる
# つまり、短いほうの辺が指定のサイズになるように書き換える
#widthOrig, heightOrig = image.size
#if widthOrig * height > heightOrig * width:
#    # 幅は指定よりも大きい状態にする
#    width = widthOrig * height / heightOrig
#elif widthOrig * height < heightOrig * width:
#    # 高さ指定よりも大きい状態にする
#    height = heightOrig * width / widthOrig

# サムネイル作成
# image自身が変更される
image.thumbnail((width, height), PIL.Image.LANCZOS)

# JPEGバイナリのバイト配列を生成
output = io.BytesIO()
image.save(output, format = "JPEG")
thumbnailBinary = output.getvalue()

2021/01/22追記

上記ソースコードコメントアウトしてあるところを有効化すると、短い辺が200になるように縦横比を維持したままリサイズします。

縦横比を変えて強制的に指定のサイズにリサイズするにはthumbnailメソッドのかわりにresizeメソッドを使います。

参考になった記事 Pillow resize と thumbnail の違い - Qiita