Python で写真のサムネイルを作成する

Python を使って,JPEG 形式の画像から任意のサイズのサムネイル(thumbnail)を作成し,所定のフォルダに保存するプログラムを作成します。このとき,画像の縦横比が変わらないようリサイズし,長い辺の両端(または上下)を切り取ります。

サムネイルとは,画像や印刷物ページなどを表示する際に視認性を高めるために縮小させた見本となる画像のこと。親指(thumb)の爪(nail)のように小さく簡潔であるという意味からきている。

視認範囲の限られるカタログや画面表示上,もしくはデータ量の限られるネットワーク上の画像情報の伝達において用いられることが多い。

フリー百科事典『ウィキペディアサムネイル

プログラムの解説

ライブラリをインポート

PIL (Python Image Library) から Image,pathlib から Path をインポートします。

from PIL import Image
from pathlib import Path

サムネイルの大きさを設定

サムネイルの大きさを設定します。今回は幅(width) 450 ピクセル,高さ(height) 300 ピクセルに設定しました。

setwidth=450
setheight=300

ファイルのパス

ファイルのパスを設定します。今回は変更前の画像のパスは path1,変更後の画像のパスは path2 で指定します。

path1=Path('before/image1.jpg')
path2=Path('after/image1_s.jpg')

変更前の画像を開く

path1 で指定した変更前の画像を開きます。

img=Image.open(path1)

参考のため,変更前の画像の例を下図に示します。

図 変更前の画像の例(大きさは 1590 × 894 ピクセル)

画像をリサイズし,余分な部分を切り取り

読み込んだ画像の縦横比に応じて,リサイズします。また,画像の余分な部分を切り取ります。

if img.width/img.height >= setwidth/setheight:
    img=img.resize((int(img.width*setheight/img.height),setheight))
    xcrop=(img.width*setheight/img.height-setwidth)//2
    img=img.crop((xcrop,0,xcrop+setwidth,setheight))
else:
    img=img.resize((setwidth,int(img.height*setwidth/img.width)))
    ycrop=(img.height*setwidth/img.width-setheight)//2
    img=img.crop((0,ycrop,setwidth,ycrop+setheight))

画像を表示し,保存

うまくサムネイルが作成できたか確認するため画像を表示した上で,path2 に保存します。

img.show()
img.save(path2)

作成したサムネイルの例

作成したサムネイルの例を下図に示します。

図 作成したサムネイル(大きさは 450 × 300 ピクセル)

プログラム

from PIL import Image
from pathlib import Path

setwidth=450
setheight=300

path1=Path('before/image1.jpg')
path2=Path('after/image1_s.jpg')

img=Image.open(path1)

if img.width/img.height >= setwidth/setheight:
    img=img.resize((int(img.width*setheight/img.height),setheight))
    xcrop=(img.width*setheight/img.height-setwidth)//2
    img=img.crop((xcrop,0,xcrop+setwidth,300))
else:
    img=img.resize((setwidth,int(img.height*setwidth/img.width)))
    ycrop=(img.height*setwidth/img.width-setheight)//2
    img=img.crop((0,ycrop,setwidth,ycrop+setheight))

img.show()
img.save(path2)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です