ぐりこ製作所日報

趣味の話を中心に。

画像の余白を一括トリミングするPythonスクリプト

今日はお手軽記事ということで、Pythonと画像処理ライブラリであるPILを使った、ディレクトリ内の画像の余白を一括トリミングするスクリプトを紹介します。

f:id:pumpkinism113:20180516221722p:plain
実行例

スクリプトを実行すると、指定されたディレクトリ(上のコードではスクリプトの置かれたディレクトリ)にある画像をすべて読み込み、直下に作成したtrimディレクトリ内にトリミング画像を保存します。

# -*- coding: utf-8 -*-

import os
import glob

from PIL import Image, ImageChops

# ディレクトリ設定
inputdir = './'
outputdir = os.path.join(inputdir, 'trim')

# ディレクトリが存在しない場合は作成する
if not os.path.exists(outputdir):
    os.mkdir(outputdir)

# ファイル検索
pngsearchpath = os.path.join(inputdir, '*.png')
pngfiles = glob.glob(pngsearchpath)

# 各ファイルの処理
for file in pngfiles:
    # 画像ファイルを開く
    print(file)
    im = Image.open(file)
    name, ext = os.path.splitext(os.path.basename(file))
    
    # 背景色画像を生成
    im2 = im.convert("RGB")
    bg = Image.new("RGB", im2.size, im2.getpixel((0, 0)))
    
    # 背景色画像と元画像の差分画像を生成
    diff = ImageChops.difference(im2, bg)
    
    # 背景との境界を求めて画像を切り抜く
    croprange = diff.convert("RGB").getbbox()
    nim = im.crop(croprange)

    # 切り抜いた画像を保存
    nim.save(os.path.join(outputdir, '%s.png' % name))

ポイントはPILに含まれるgetbbox()という関数で、画像周辺の黒い部分を除いた領域の位置と大きさを返してくれます。ただし、このままだと余白が黒い画像にしか使えないので、背景色(スクリプトでは画像左上隅)と元画像の差分画像を生成することで対応しています。