web-dev-qa-db-ja.com

PILを使用して透明なpng画像を別の画像とマージする方法

透明なpng画像「foo.png」があり、別の画像を開いた

im = Image.open("foo2.png");

今私が必要なのは、foo.pngとfoo2.pngをマージすることです。

(foo.pngにはテキストが含まれており、そのテキストをfoo2.pngに印刷したい)

131
Arackna
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 を確認してください。

241
nosklo

背景画像に透明度が含まれている場合、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')を呼び出す必要があります。背景にアルファチャンネルがない場合は、通常の貼り付け方法を使用できます(高速になるはずです)。

56
olt

oltがすでに指摘しているように、ソースおよび宛先の両方にアルファが含まれている場合、Image.pasteは正しく機能しません。

次のシナリオを検討してください。

2つのテスト画像(両方ともアルファを含む):

enter image description hereenter image description here

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番目のレイヤーから完全に取得されます。ピクセルは正しくブレンドされません)。

enter image description here

Image.alpha_compositeを使用した画像の合成は次のようになります。

final2 = Image.new("RGBA", layer1.size)
final2 = Image.alpha_composite(final2, layer1)
final2 = Image.alpha_composite(final2, layer2)

次の(正しい)イメージが生成されます。

enter image description here

39
P.Melch

ブレンディングも使用できます。

im1 = Image.open("im1.png")
im2 = Image.open("im2.png")
blended = Image.blend(im1, im2, alpha=0.5)
blended.save("blended.png")
8
nvd

同様の質問があり、答えを見つけるのが困難でした。次の関数を使用すると、特定のオフセットで別の画像の上に透明度パラメーターを持つ画像を貼り付けることができます。

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()
0
lee
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
0
陈旭周记