python: pillow 画像をアスペクト比を保持してリサイズし、不足した部分を補完する
備忘録です。今回は画像をリサイズする際にアスペクト比を保持して実行する方法と併せて不足した部分をグレイ背景で補完する方法についてまとめます。
縦横比を維持する
幅50、高さ100のサイズの画像を幅200、高さ200の正方形にリサイズする際、そのままリサイズで幅と高さを200にしてしまう(縦横比を維持しない)と画像のイメージが膨らんだり縮んだりしてしまいます。
そこで、まず元画像の幅、高さのどちらかに併せて縦横比を維持しつつ拡大します。例えば高さを200に合わせて拡大します。すると幅は100になります。
イメージとしては下記のようになります。
下側は幅150、高さ300のサイズの画像を同じく幅200、高さ200のサイズに変えるために、まずアスペクト比を維持しつつ高さを200に合わせて縮小した場合、幅は90になります。
これらから、図の横に計算式を書いていますが、アスペクト比を維持しつつ高さを200に変える場合
リサイズ後の幅 = リサイズ後の高さ ÷ リサイズ前の高さ x リサイズ前の幅
で求めることができます。こうして求めたサイズをpillowのresizeに引数として渡せば元画像のサイズ変更が可能です。
あとは足りていない部分をどうするかですが、今回は足りない部分を灰色の背景で埋めることにします。
上記のような感じです。
足りない部分を灰色で埋める
足りない部分を灰色で埋める方法として挙げられるのが、200x200のベタ背景を新たに作ってそこにresizeで縮小、または拡大した画像を貼り付けることです。
これにはpillowのnew()とpaste()を使用します。
コード
上記を実行するコードが下記になります。
作成した画像が下記になります。