透明なpng画像「foo.png」があり、別の画像を開いた
im = Image.open("foo2.png");
今私が必要なのは、foo.pngとfoo2.pngをマージすることです。
(foo.pngにはテキストが含まれており、そのテキストをfoo2.pngに印刷したい)
import Image
background = Image.open("test1.png")
foreground = Image.open("test2.png")
background.paste(foreground, (0, 0), foreground)
background.show()
.paste()
の最初のパラメーターは、貼り付ける画像です。 2番目は座標であり、秘密のソースは3番目のパラメーターです。画像を貼り付けるために使用されるmaskを示します。透明な画像を渡す場合、アルファチャネルがマスクとして使用されます。
docs を確認してください。
背景画像に透明度が含まれている場合、Image.paste
は期待どおりに機能しません。実際の Alpha Compositing を使用する必要があります。
Pillow 2.0には、これを行うalpha_composite
関数が含まれています。
background = Image.open("test1.png")
foreground = Image.open("test2.png")
Image.alpha_composite(background, foreground).save("test3.png")
編集:両方の画像はRGBAタイプである必要があります。したがって、パレットなどにconvert('RGBA')
を呼び出す必要があります。背景にアルファチャンネルがない場合は、通常の貼り付け方法を使用できます(高速になるはずです)。
oltがすでに指摘しているように、ソースおよび宛先の両方にアルファが含まれている場合、Image.paste
は正しく機能しません。
次のシナリオを検討してください。
2つのテスト画像(両方ともアルファを含む):
layer1 = Image.open("layer1.png")
layer2 = Image.open("layer2.png")
Image.paste
を使用した画像の合成は次のようになります。
final1 = Image.new("RGBA", layer1.size)
final1.paste(layer1, (0,0), layer1)
final1.paste(layer2, (0,0), layer2)
次の画像を生成します(オーバーレイされた赤いピクセルのアルファ部分は、2番目のレイヤーから完全に取得されます。ピクセルは正しくブレンドされません)。
Image.alpha_composite
を使用した画像の合成は次のようになります。
final2 = Image.new("RGBA", layer1.size)
final2 = Image.alpha_composite(final2, layer1)
final2 = Image.alpha_composite(final2, layer2)
次の(正しい)イメージが生成されます。
ブレンディングも使用できます。
im1 = Image.open("im1.png")
im2 = Image.open("im2.png")
blended = Image.blend(im1, im2, alpha=0.5)
blended.save("blended.png")
同様の質問があり、答えを見つけるのが困難でした。次の関数を使用すると、特定のオフセットで別の画像の上に透明度パラメーターを持つ画像を貼り付けることができます。
import Image
def trans_paste(fg_img,bg_img,alpha=1.0,box=(0,0)):
fg_img_trans = Image.new("RGBA",fg_img.size)
fg_img_trans = Image.blend(fg_img_trans,fg_img,alpha)
bg_img.paste(fg_img_trans,box,fg_img_trans)
return bg_img
bg_img = Image.open("bg.png")
fg_img = Image.open("fg.png")
p = trans_paste(fg_img,bg_img,.7,(250,100))
p.show()
def trans_paste(bg_img,fg_img,box=(0,0)):
fg_img_trans = Image.new("RGBA",bg_img.size)
fg_img_trans.paste(fg_img,box,mask=fg_img)
new_img = Image.alpha_composite(bg_img,fg_img_trans)
return new_img