LoginSignup
6
7

More than 3 years have passed since last update.

Pillowで透過画像を合成したら背景画像の一部も透明になってしまうときの対処法

Last updated at Posted at 2020-08-07

まえがき

Pillowを使って大きさの違うPNG画像をimg.pasteで重ねたら、上レイヤーの透過が下レイヤーまで貫通して背景が一部分なくなってしまうという現象が発生したので、その対処法のメモ。

環境

Python 3.8.2
Pillow 7.2
Ubuntu 20.04 on WSL2

背景と重ねたい画像

背景(bg_cloudy.png)
bg_cloudy.png

重ねたい画像(cloudy.png)
cloudy.png

これは背景に不具合が出る

ただbg.pasteimgを重ねるようとすると切れる

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

結果

雲のアイコンの透過部分で背景も透過されてしまっている
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')

結果

透過部分に不具合出ることなく狙い通りに合成できた。
success.png

参考

https://www.it-swarm.dev/

画像の出典

背景の雲の画像
https://www.priga.jp/
アイコンの雲の画像
https://github.com/twitter/twemoji

6
7
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
6
7