ビジネスパーソン・ガジェット置場 empty lot for business

営業や仕事、それに伴う生活を便利に楽にするツール、ガジェットを作ります。既にあるツールも自分用にカスタマイズ。

python: pillow 画像をアスペクト比を保持してリサイズし、不足した部分を補完する

備忘録です。今回は画像をリサイズする際にアスペクト比を保持して実行する方法と併せて不足した部分をグレイ背景で補完する方法についてまとめます。

縦横比を維持する

幅50、高さ100のサイズの画像を幅200、高さ200の正方形にリサイズする際、そのままリサイズで幅と高さを200にしてしまう(縦横比を維持しない)と画像のイメージが膨らんだり縮んだりしてしまいます。

 

そこで、まず元画像の幅、高さのどちらかに併せて縦横比を維持しつつ拡大します。例えば高さを200に合わせて拡大します。すると幅は100になります。

 

イメージとしては下記のようになります。

下側は幅150、高さ300のサイズの画像を同じく幅200、高さ200のサイズに変えるために、まずアスペクト比を維持しつつ高さを200に合わせて縮小した場合、幅は90になります。

 

これらから、図の横に計算式を書いていますが、アスペクト比を維持しつつ高さを200に変える場合

 

リサイズ後の幅 = リサイズ後の高さ ÷ リサイズ前の高さ x リサイズ前の幅

 

で求めることができます。こうして求めたサイズをpillowのresizeに引数として渡せば元画像のサイズ変更が可能です。

 

あとは足りていない部分をどうするかですが、今回は足りない部分を灰色の背景で埋めることにします。

 

上記のような感じです。

 

足りない部分を灰色で埋める

足りない部分を灰色で埋める方法として挙げられるのが、200x200のベタ背景を新たに作ってそこにresizeで縮小、または拡大した画像を貼り付けることです。

 

これにはpillowのnew()とpaste()を使用します。

 

 

コード

上記を実行するコードが下記になります。

file = '画像のパス'
img = Image.open(file)
original_size = img.size
# 高さ200に合わせて幅を計算し、resizeの引数に渡します img = img.resize((int(200/original_size[1]*original_size[0]), 200), Image.LANCZOS)
# ベタ背景を作るnewの引数は第一引数がカラーモード、第二引数がサイズ、第三引数が色になります betaimg = Image.new('RGB', (200, 200), (128, 128, 128))
# 下手背景にimgを貼り付けます betaimg.paste(img)

 

作成した画像が下記になります。