LoginSignup
2
2

More than 5 years have passed since last update.

pillow で透過画像の一部を切り抜きたい

Posted at

透過画像の一部を消したい

画像は文字の緑以外は透明にしているのだが,左から右のように透過 PNG の一部を切り取って消したい.
letter.pngltter.png
ペイントソフトでやるなら簡単だ.
しかし Python pillow でやろうとしたところ少し苦労した.
"python pillow alphachannel merge"
などでググっても出てこなかった.
Image クラスにはアルファチャンネルだけを操作するようなメソッドが(おそらく)なく,
あまり有名ではない ImageChops クラスを利用することで解決した.

正解

消したい場所を黒くしたマスクを用意.
mask.png
アルファチャンネルだけを取り出して演算をし,アルファチャンネルに代入した.

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')

応用

別に「切り取る」だけではなくて,透過画像の一部を半透明にすることもできる.
使うマスクを変えれば様々な階調で透明度を変えることは簡単.
mask2.png lttr.png

しかし誰かの役に立つ日が来るとは思えないテクニックだ.

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2