透過画像の一部を消したい
画像は文字の緑以外は透明にしているのだが,左から右のように透過 PNG の一部を切り取って消したい.
→
ペイントソフトでやるなら簡単だ.
しかし Python pillow でやろうとしたところ少し苦労した.
"python pillow alphachannel merge"
などでググっても出てこなかった.
Image クラスにはアルファチャンネルだけを操作するようなメソッドが(おそらく)なく,
あまり有名ではない ImageChops クラスを利用することで解決した.
正解
消したい場所を黒くしたマスクを用意.
アルファチャンネルだけを取り出して演算をし,アルファチャンネルに代入した.
from PIL import Image, ImageChops
# ensure letter having 4 channels RGBA
letter = Image.open('letter.png')
if letter.mode != 'RGBA':
letter = letter.convert('RGBA')
# ensure mask having 1 channel
mask = Image.open('mask.png')
if mask.mode not in ['1', 'L']:
mask = mask.convert('L')
# get alphachannel of letter.png
letter_alphachannel = letter.split()[3]
# note: "dark" in alphachannel means "transparent"
merged_mask = ImageChops.darker(mask, letter_alphachannel)
# insert merged alphachannel
letter.putalpha(merged_mask)
# save to file
letter.save('lttr.png')
応用
別に「切り取る」だけではなくて,透過画像の一部を半透明にすることもできる.
使うマスクを変えれば様々な階調で透明度を変えることは簡単.
しかし誰かの役に立つ日が来るとは思えないテクニックだ.