まえがき
Pillowを使って大きさの違うPNG画像をimg.paste
で重ねたら、上レイヤーの透過が下レイヤーまで貫通して背景が一部分なくなってしまうという現象が発生したので、その対処法のメモ。
環境
Python 3.8.2
Pillow 7.2
Ubuntu 20.04 on WSL2
背景と重ねたい画像
これは背景に不具合が出る
ただbg.paste
でimg
を重ねるようとすると切れる
from PIL import Image
#背景画像をオープンしてRGBAに変換
bg = Image.open('bg_cloudy.png').convert('RGBA')
img = Image.open('cloudy.png').convert('RGBA')
#ペースト
bg.paste(img, (232, 412))
bg.save('fail.png')
結果
対処法
Image.alpha_composite(bg, img)
を使うことで回避できる。ただし第一引数と第二引数の画像のサイズが一致している必要があるので、一旦背景と大きさを揃えた何もないの透過画像の上の指定位置に貼り付けてから重ねて合成をする。
from PIL import Image
bg = Image.open('bg_cloudy.png').convert('RGBA')
img = Image.open('cloudy.png').convert('RGBA')
#背景と同サイズの透明な画像を生成
img_clear = Image.new("RGBA", bg.size, (255, 255, 255, 0))
#透明画像の上にペースト
img_clear.paste(img, (232, 412))
#重ね合わせる
bg = Image.alpha_composite(bg, img_clear)
bg.save('success.png')
結果
参考
画像の出典
背景の雲の画像
https://www.priga.jp/
アイコンの雲の画像
https://github.com/twitter/twemoji