😷
Pillowで画像をマスク画像に従ってクロップ
四角形のアイコン画像の角を丸めたい,そんな時ありますよね.
この辺とかこの辺とか参照したうえで,より良い方法を検討した結果を報告します.
解法
画像を2枚用意します.一つがマスク (mask.png
) ,一つはクロップする対象 (image.png
) です.二つの高さと幅は一致している必要があります.
import numpy as np
from PIL import Image
mask = Image.open( r"mask.png" )
mask = np.array( mask )
img = Image.open( r"image.png" )
img = np.array( img )
img[:, :, 3] = mask[:, :, 3]
img = Image.fromarray( img )
img.save( r"result.png" )
結果は以下です.
マスク画像 | クロップ対象 | 結果 |
---|---|---|
クロップ対象の画像の角が,マスク画像に従って丸まりました.かわいい.
解説
やっていることは単純で,以下の行で:
img[:, :, 3] = mask[:, :, 3]
クロップ対象画像のアルファチャンネルを,マスク画像のアルファチャンネルに置き換えているだけです.
マスク画像の透明な箇所が,元画像でも透明になる,といった形です.
応用
マスク画像を複雑にすれば,以下のようにくりぬくこともできます.
マスク画像 | クロップ対象 | 結果 |
---|---|---|
さらに,アルファチャンネルを反転させて置き換えることで,
img[:, :, 3] = (255 - mask[:, :, 3])
以下のような感じにもできます.
マスク画像 | クロップ対象 | 結果 |
---|---|---|
アルファチャンネルの値は0-255をとるので,透明度をグラデーションさせたマスクを用意すれば,
マスク画像 | クロップ対象 | 結果 |
---|---|---|
色々できます.
終わりに
よく考えたらそりゃそうだろ,って感じですよね.
皆さんも角を丸めて楽しんでください.
Discussion