Ich habe ein transparentes PNG-Bild "foo.png" und ich 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 Text und ich möchte diesen Text auf foo2.png drucken.)
Ich habe ein transparentes PNG-Bild "foo.png" und ich 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 Text und ich möchte diesen Text auf foo2.png drucken.)
;
am Ende Ihrer Befehle in Python: Es ist hässlich ...Antworten:
Der erste Parameter
.paste()
ist das einzufügende Bild. Zweitens sind Koordinaten, und die geheime Sauce ist der dritte Parameter. Es zeigt eine Maske 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 Dokumente .
quelle
foreground.convert('RGBA')
für den Maskenparameter, um sicherzustellen, dass der Vordergrund in allen Fällen Transparenz enthält .ValueError: bad transparency mask
ValueError: bad transparency mask
Verwendung zu behebenbg.paste(fg, (0, 0), fg.convert('RGBA'))
Image.paste
funktioniert nicht wie erwartet, wenn das Hintergrundbild auch Transparenz enthält. Sie müssen echtes Alpha Compositing verwenden .Pillow 2.0 enthält eine
alpha_composite
Funktion, die dies tut.BEARBEITEN: Beide Bilder müssen vom Typ RGBA sein. Sie müssen also aufrufen,
convert('RGBA')
wenn sie palettiert sind usw. Wenn der Hintergrund keinen Alphakanal hat, können Sie die reguläre Einfügemethode verwenden (die schneller sein sollte).quelle
ValueError: image has wrong made
auch @DenizOzgerWie olt bereits erwähnt,
Image.paste
funktioniert nicht richtig, wenn die Quelle und Ziel beider Alpha enthalten.Stellen Sie sich das folgende Szenario vor:
Zwei Testbilder, beide enthalten Alpha:
Zusammensetzen eines Bildes mit folgendem
Image.paste
:erzeugt das folgende Bild (der Alpha-Teil der überlagerten roten Pixel wird vollständig aus der 2. Ebene übernommen. Die Pixel werden nicht richtig gemischt):
Zusammensetzen eines Bildes mit folgendem
Image.alpha_composite
:erzeugt das folgende (richtige) Bild:
quelle
alpha_composite
kann den Offset nicht einstellen, würde es Ihnen etwas ausmachen, ein Beispiel zu geben, um diepaste
Funktion vollständig zu ersetzen ?Man kann auch das Mischen verwenden:
quelle
quelle
Hatte eine ähnliche Frage und hatte Schwierigkeiten, eine Antwort zu finden. Mit der folgenden Funktion können Sie ein Bild mit einem Transparenzparameter mit einem bestimmten Versatz über ein anderes Bild einfügen.
quelle
ValueError: images do not match
Am Ende habe ich mir den Vorschlag dieses Kommentars codiert, den der Benutzer @ P.Melch gemacht und von @Mithril für ein Projekt vorgeschlagen hat, an dem ich arbeite.
Ich habe auch außerhalb der Grenzen der Sicherheit codiert, hier ist der Code dafür . (Ich habe ein bestimmtes Commit verknüpft, da sich die Dinge in der Zukunft dieses Repositorys ändern können.)
Hinweis: Ich erwarte numpy Arrays von den Bildern wie
np.array(Image.open(...))
die Eingänge A und B voncopy_from
und diese verknüpfte Funktionoverlay
.Die Abhängigkeiten sind die Funktion direkt davor, die
copy_from
Methode und die Numpy-Arrays als PIL-Bildinhalt für das Schneiden.Obwohl die Datei sehr klassenorientiert ist, müssen Sie die Funktion
overlay_transparent
umbenennen , wenn Sie diese Funktion verwenden möchtenself.frame
klassenorientiert ist, müssen Sie das Numpy-Array in Ihr Hintergrundbild möchten.Oder Sie können einfach die gesamte Datei kopieren (wahrscheinlich einige Importe und die
Utils
Klasse entfernen ) und mit dieser Frame-Klasse wie folgt interagieren:Dann haben Sie Ihr
background.frame
als überlagertes und Alpha-zusammengesetztes Array, Sie können ein PIL-Bild daraus erhalten mitoverlayed = Image.fromarray(background.frame)
oder so etwas wie:Oder einfach
background.save("save path")
so, wie es direkt aus der Alpha-zusammengesetzten internenself.frame
Variablen hervorgeht.Sie können die Datei lesen und einige andere nette Funktionen mit dieser Implementierung ich wie die Methoden codiert finden
get_rgb_frame_array
,resize_by_ratio
,resize_to_resolution
,rotate
,gaussian_blur
,transparency
,vignetting
:)Sie möchten wahrscheinlich die entfernen
resolve_pending
Methode , da dies für dieses Projekt spezifisch ist.Ich bin froh, wenn ich dir geholfen habe, schau dir unbedingt das Repo des Projekts an, über das ich spreche. Diese Frage und dieser Thread haben mir bei der Entwicklung sehr geholfen :)
quelle