2017-04-30 4 views
2

Ich versuche, ein zusammengesetztes Bild von einem JPEG-Foto (1600x900) und ein PNG-Logo mit Alpha-Kanal (400x62) zu machen.PIL: PNG-Bild als Wasserzeichen für ein JPG-Bild

Dies ist ein Befehl, der den Job mit Image Magick tut:

composite -geometry +25+25 watermark.png original_photo.jpg watermarked_photo.jpg 

Jetzt würde ich etwas ähnliches in einem Python-Skript zu tun, ohne von außen diesen Shell-Befehl aufgerufen wird, mit PIL.

Hier ist, was ich versuchte:

photo = Image.open('original_photo.jpg') 
watermark = Image.open('watermark.png') 
photo.paste(watermark, (25, 25)) 

Das Problem hierbei ist, dass der Alpha-Kanal vollständig ignoriert wird und das Ergebnis ist, als ob mein Wasserzeichen als rbga(0, 0, 0, 0) schwarz und weiß eher war und rbga(255, 255, 255, 128).

Tatsächlich PIL docs state: "Siehe alpha_composite(), wenn Sie Bilder in Bezug auf ihre Alpha-Kanäle kombinieren möchten."

Also schaute ich auf alpha_composite(). Leider erfordert diese Funktion, dass beide Bilder dieselbe Größe und denselben Modus haben.

Antwort

7

Schließlich las ich Image.paste() genauer und fanden diese heraus:

Wenn eine Maske gegeben ist, diese Methode aktualisiert nur die Regionen durch die Maske angezeigt. Sie können entweder "1", "L" oder "RGBA" -Bilder verwenden (im letzteren Fall wird das Alpha-Band als Maske verwendet). Wenn die Maske 255 ist, wird das gegebene Bild wie es ist kopiert. Wenn die Maske 0 ist, wird der aktuelle Wert beibehalten. Zwischenwerte mischen die beiden Bilder zusammen, einschließlich ihrer Alpha-Kanäle, wenn sie diese haben.

Also versuchte ich folgendes:

photo = Image.open('original_photo.jpg') 
watermark = Image.open('watermark.png') 
photo.paste(watermark, (25, 25), watermark) 

Und ... es hat funktioniert!