note.nkmk.me

Python, Pillowで画像の上下左右に余白を追加しサイズ変更

Date: 2017-12-03 / tags: Python, Pillow, 画像処理
このエントリーをはてなブックマークに追加
スポンサーリンク

余白を追加しキャンバスを拡大

ある画像を任意のサイズにしたいけどアスペクト比(縦横比)を変えたりトリミングしたりしたくない場合に、画像の上下左右に余白を追加してサイズを調節する。

画像編集ソフトでキャンバスを拡大するイメージ。

Pythonの画像処理ライブラリPolliw(PIL)のImageモジュールのメソッドpaste()でこれを実現する。

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

トリミング(切り出し / 切り抜き)については以下の記事参照。

コード例

PILからImageをインポートし、元画像を読み込んでおく。

from PIL import Image

im = Image.open('data/src/lena.jpg')

lena

上下左右に任意の幅の余白を追加する

new()で単色無地の画像(ベタ画像)を生成し、paste()で元画像を貼り付けるという流れ。

以下の関数を定義。

def add_margin(pil_img, top, right, bottom, left, color):
    width, height = pil_img.size
    new_width = width + right + left
    new_height = height + top + bottom
    result = Image.new(pil_img.mode, (new_width, new_height), color)
    result.paste(pil_img, (left, top))
    return result
source: imagelib.py

使ってみる。

im_new = add_margin(im, 50, 10, 0, 100, (128, 0, 64))
im_new.save('data/dst/lena_add_margin.jpg', quality=95)

lena add margin

長方形に余白を追加し正方形にする

長方形画像のアスペクト比(縦横比)を維持したまま短辺に余白を追加し正方形にする。

いちいち余白の幅を計算して指定するのは面倒なので、以下の関数を新たに定義。

def expand2square(pil_img, background_color):
    width, height = pil_img.size
    if width == height:
        return pil_img
    elif width > height:
        result = Image.new(pil_img.mode, (width, width), background_color)
        result.paste(pil_img, (0, (width - height) // 2))
        return result
    else:
        result = Image.new(pil_img.mode, (height, height), background_color)
        result.paste(pil_img, ((height - width) // 2, 0))
        return result
source: imagelib.py

使ってみる。

im_new = expand2square(im, (0, 0, 0))
im_new.save('data/dst/lena_square.jpg', quality=95)

lena square

サムネイルを作る場合など、決まったサイズの正方形にしたい場合は、余白を追加したあとresize()すればOK。

im_new = expand2square(im, (0, 0, 0)).resize((150, 150))
スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事