Python Imaging Library (PIL)でpng画像を合成しても透過のままであってほしい
二つの画像を用意して,合成したときに,透過はそのままにしたい.
import Image import ImageDraw img1 = Image.new("RGB", (500, 500), (255, 0, 0)) img2 = Image.new("RGBA", (500, 500), (0, 0, 0, 0)) draw2 = ImageDraw.Draw(img2) draw2.ellipse(((100, 100), (400, 400)), (0, 255, 255), (0, 255, 255)) img1.paste(img2, (0, 0)) img1.save("test.png")
こんな感じで合成しようとすると,透過されない.
で,こちらを参考にさせていただき,pasteメソッドにmask指定が必要らしい,ということが分かった.
で,こうする
import Image import ImageDraw img1 = Image.new("RGB", (500, 500), (255, 0, 0)) img2 = Image.new("RGBA", (500, 500), (0, 0, 0, 0)) draw2 = ImageDraw.Draw(img2) draw2.ellipse(((100, 100), (400, 400)), (0, 255, 255), (0, 255, 255)) img1.paste(img2, (0, 0), img2.split()[3]) # <- ここ img1.save("test.png")
これで,こうなる.
Image.split()で,RGBAの各チャンネルの画像を抽出できるらしい.
printしてみると,
(<Image.Image image mode=L size=500x500 at 0x106FB8FC8>, <Image.Image image mode=L size=500x500 at 0x106FB8E18>, <Image.Image image mode=L size=500x500 at 0x106FB8DD0>, <Image.Image image mode=L size=500x500 at 0x106FB8F38>)
なるほど.