Ich habe ein transparentes png-Bild "foo.png" Und habe ein anderes Bild mit geöffnet
im = Image.open("foo2.png");
jetzt muss ich foo.png mit foo2.png zusammenführen.
(foo.png enthält etwas Text und ich möchte diesen Text auf foo2.png drucken)
import Image
background = Image.open("test1.png")
foreground = Image.open("test2.png")
background.paste(foreground, (0, 0), foreground)
background.show()
Der erste Parameter für .paste()
ist das Bild, das eingefügt werden soll. Zweitens sind Koordinaten und die geheime Sauce ist der dritte Parameter. Es zeigt eine Maske mask an, die zum Einfügen des Bildes verwendet wird. Wenn Sie ein Bild mit Transparenz übergeben, wird der Alphakanal als Maske verwendet.
Überprüfen Sie die docs .
Image.paste
funktioniert nicht wie erwartet, wenn das Hintergrundbild auch Transparenz enthält. Sie müssen real Alpha Compositing verwenden.
Pillow 2.0 enthält eine alpha_composite
-Funktion, die dies ausführt.
background = Image.open("test1.png")
foreground = Image.open("test2.png")
Image.alpha_composite(background, foreground).save("test3.png")
BEARBEITEN: Beide Bilder müssen vom Typ RGBA sein. Sie müssen also convert('RGBA')
aufrufen, wenn sie palettiert sind usw. Wenn der Hintergrund keinen Alphakanal aufweist, können Sie die normale Einfügemethode verwenden (die schneller sein sollte).
Wie olt bereits angedeutet hat, funktioniert Image.paste
nicht richtig, wenn Quell- und -Ziel beide Alpha enthalten.
Stellen Sie sich das folgende Szenario vor:
Zwei Testbilder enthalten beide Alpha:
layer1 = Image.open("layer1.png")
layer2 = Image.open("layer2.png")
Bild mit Image.paste
so zusammensetzen:
final1 = Image.new("RGBA", layer1.size)
final1.paste(layer1, (0,0), layer1)
final1.paste(layer2, (0,0), layer2)
erzeugt das folgende Bild (der Alpha-Teil der überlagerten roten Pixel wird vollständig von der 2. Ebene übernommen. Die Pixel werden nicht korrekt gemischt):
Bild mit Image.alpha_composite
so zusammensetzen:
final2 = Image.new("RGBA", layer1.size)
final2 = Image.alpha_composite(final2, layer1)
final2 = Image.alpha_composite(final2, layer2)
erzeugt das folgende (korrekte) Bild:
Man kann auch Blending verwenden:
im1 = Image.open("im1.png")
im2 = Image.open("im2.png")
blended = Image.blend(im1, im2, alpha=0.5)
blended.save("blended.png")
Hatte eine ähnliche Frage und hatte Schwierigkeiten, eine Antwort zu finden. Mit der folgenden Funktion können Sie ein Bild mit einem Transparenzparameter in einem bestimmten Abstand über einem anderen Bild einfügen.
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