it-swarm.com.de

So fügen Sie ein transparentes PNG-Bild mithilfe von PIL mit einem anderen Bild zusammen

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)

119
Arackna
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 .

211
nosklo

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

53
olt

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:

 enter image description here  enter image description here

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

 enter image description here

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:

 enter image description here

35
P.Melch

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

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