So verschmelzen Sie ein transparentes PNG-Bild mit einem anderen Bild mit PIL

Lesezeit: 5 Minuten

So verschmelzen Sie ein transparentes PNG Bild mit einem anderen Bild
Arackna

Ich habe ein transparentes PNG-Bild “foo.png” und ich habe ein anderes Bild damit 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)

  • Nicht verwenden ; am Ende Ihrer Befehle in Python: Es ist hässlich …

    – nosklo

    16. März 11 um 11:48 Uhr

  • Das werde ich mir merken, danke!!

    – Arackna

    16. März 11 um 12:39 Uhr

So verschmelzen Sie ein transparentes PNG Bild mit einem anderen Bild
nosklo

from PIL import Image

background = Image.open("test1.png")
foreground = Image.open("test2.png")

background.paste(foreground, (0, 0), foreground)
background.show()

Erster Parameter zu .paste() ist das einzufügende Bild. An zweiter Stelle stehen die Koordinaten, und die geheime Sauce ist der dritte Parameter. Es zeigt a Maske die zum Einfügen des Bildes verwendet wird. Wenn Sie ein Bild mit Transparenz übergeben, wird der Alphakanal als Maske verwendet.

Überprüf den Dokumente.

  • Um sicherzustellen, dass der Vordergrund in allen Fällen transparent ist, verwenden Sie foreground.convert('RGBA') für den Maskenparameter.

    – Markieren Sie Lösegeld

    4. Oktober 12 um 2:28 Uhr

  • Danke. Ich habe den dritten Parameter zu vermisst.

    – Silouane Gerin

    19. August 13 um 2:00 Uhr

  • Ich erhalte ValueError: bad transparency mask

    – Deniz Özger

    3. März 16 um 15:48 Uhr

  • Die geheime Sauce war lecker

    – AFP_555

    15. April 18 um 0:06 Uhr

  • @DenizOzger Zur Behebung ValueError: bad transparency mask benutzen bg.paste(fg, (0, 0), fg.convert('RGBA'))

    – Mingwei Samuel

    1. Januar 19 um 3:01 Uhr

1643796374 130 So verschmelzen Sie ein transparentes PNG Bild mit einem anderen Bild
alt

Image.paste funktioniert nicht wie erwartet, wenn das Hintergrundbild auch Transparenz enthält. Sie müssen real verwenden Alpha-Compositing.

Pillow 2.0 enthält ein alpha_composite Funktion, die dies tut.

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 anrufen convert('RGBA') wenn sie palettiert sind usw. Wenn der Hintergrund keinen Alphakanal hat, können Sie die normale Einfügemethode verwenden (die schneller sein sollte).

  • Ich habe gerade paste() verwendet, um ein halbtransparentes Bild mit PIL über ein anderes zu legen, und es hat wie erwartet funktioniert. Inwiefern funktioniert es nicht wie erwartet?

    – Peter Hansen

    25. Juli 13 um 17:27 Uhr

  • @PeterHansen, paste() funktioniert nicht wie erwartet, “wenn das Hintergrundbild auch Transparenz enthält”.

    – hmm

    5. November 14 um 17:19 Uhr

  • @PeterHansen Es gibt ein Beispiel: github.com/python-pillow/Pillow/issues/…

    – hmm

    5. November 14 um 17:53 Uhr

  • @homm danke. Das ist so lange her, dass ich mich nicht daran erinnern kann, was ich versucht habe. Es ist wahrscheinlich, dass ich den von Ihnen zitierten Teil über das Hintergrundbild mit Transparenz verpasst habe.

    – Peter Hansen

    5. November 14 um 19:58 Uhr

  • Ich bekomme ValueError: image has wrong made sowie @DenizOzger

    – digitaldavenyc

    11. Oktober 16 um 20:55 Uhr

Wie alt bereits darauf hingewiesen, Image.paste funktioniert nicht richtig, wenn source und Ziel enthalten beide Alpha.

Betrachten Sie das folgende Szenario:

Zwei Testbilder, beide enthalten Alpha:

Geben Sie hier die Bildbeschreibung ein
Geben Sie hier die Bildbeschreibung ein

layer1 = Image.open("layer1.png")
layer2 = Image.open("layer2.png")

Zusammensetzen von Bildern mit Image.paste so:

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

Geben Sie hier die Bildbeschreibung ein

Zusammensetzen von Bildern mit Image.alpha_composite so:

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

ergibt folgendes (korrektes) Bild:

Geben Sie hier die Bildbeschreibung ein

  • Danke für die Screenshots! Hilft wirklich!

    – Vietnam

    1. Mai 17 um 8:44 Uhr

  • Aber alpha_composite kann den Offset nicht einstellen, hättest du etwas dagegen, ein Beispiel zu geben, um ihn komplett zu ersetzen paste Funktion?

    – Mithril

    10. Juli 17 um 08:03 Uhr


  • Ich denke, Sie müssten ein neues leeres Bild mit der gleichen Größe wie das Garget-Bild erstellen, die Ebene an der richtigen Position einfügen und alpha_compositing verwenden, um das neue Bild über das Zielbild zu mischen.

    – P. Melch

    11. Juli 17 um 15:24 Uhr

  • Ich erhalte: ValueError: Bilder stimmen nicht überein

    – Student

    13. Juni 21 um 10:00 Uhr

  • Bilder müssen die gleiche Größe haben

    – P. Melch

    17. Juni 21 um 6:58 Uhr

1643796377 512 So verschmelzen Sie ein transparentes PNG Bild mit einem anderen Bild
nvd

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 über einem anderen Bild mit einem bestimmten Versatz 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()

  • ValueError: images do not match

    – lllllllllllll

    15. Mai 19 um 14:33 Uhr

So verschmelzen Sie ein transparentes PNG Bild mit einem anderen Bild
陈旭周记

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

  • ValueError: images do not match

    – lllllllllllll

    15. Mai 19 um 14:33 Uhr

1643796378 993 So verschmelzen Sie ein transparentes PNG Bild mit einem anderen Bild
Krystof

Hier ist mein Code zum Zusammenführen von 2 Bildern unterschiedlicher Größe, jeweils mit Transparenz und mit Offset:

from PIL import Image

background = Image.open('image1.png')
foreground = Image.open("image2.png")

x = background.size[0]//2
y = background.size[1]//2

background = Image.alpha_composite(
    Image.new("RGBA", background.size),
    background.convert('RGBA')
)

background.paste(
    foreground,
    (x, y),
    foreground
)

background.show()

Dieses Snippet ist eine Mischung aus den vorherigen Antworten, wobei Elemente mit Offset gemischt werden, während Bilder mit unterschiedlichen Größen, jeweils mit Transparenz, verarbeitet werden.

.

739810cookie-checkSo verschmelzen Sie ein transparentes PNG-Bild mit einem anderen Bild mit PIL

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy