読者です 読者をやめる 読者になる 読者になる

[[ともっくす alloc] init]

ともっくすの雑多な日記と技術的なメモ

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

こんな感じで合成しようとすると,透過されない.
f:id:o_tomox:20130913225746p:plain


で,こちらを参考にさせていただき,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")

これで,こうなる.
f:id:o_tomox:20130913231015p:plain


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

なるほど.