Ersetzen Sie die Transparenz in PNG-Bildern durch weißen Hintergrund

294

Ich habe einige PNG-Bilder mit Transparenz und muss Versionen mit der Bildebene erstellen, die auf einem weißen Hintergrund erstellt wurde. Ich habe verschiedene Dinge mit Image Magick "Konvertierungs" -Operationen versucht, aber entweder passiert überhaupt nichts oder ich erhalte eine Fehlermeldung. Ich möchte nicht zu einem JPG-Zwischenformular wechseln, weil ich die Artefakte nicht möchte. Natürlich ist es einfach, dies in Gimp oder Photoshop oder was auch immer zu tun, aber ich würde es wirklich lieber über die Befehlszeile schreiben, weil es viele dieser Dinge gibt.

Ein Beispiel für einen nicht funktionierenden Image Magick-Befehl ist:

convert img1.png -background white -flatten img1-white.png

Das führt zu einem Fehler.

Vielen Dank!

Spitze
quelle
In meinem speziellen Fall trat ein Konflikt mit der Transparenzschicht in PNG auf, wenn ein (Apache) FO-Prozessor zum Erstellen eines PDF / A verwendet wurde. PDF / A erlaubt keine Transparenz. Der Hack, den ich verwendet habe, ist, mich stattdessen an JPG zu wenden.
Wivani
3
"Das führt zu einem Fehler." Was ist die Fehlermeldung?
Aaron McDaid
Dieser Befehl sollte gut funktionieren. Wenn dies nicht der Fall ist, haben Sie möglicherweise eine fehlerhafte Installation von Imagemagick oder libpng oder Ihre Versionen von beiden sind zu alt. Was ist Ihre Version von Imagemagick und libpng?
FMW42

Antworten:

255

Das funktioniert bei mir:

convert -flatten img1.png img1-white.png

Dokumentationsreferenzen:

remosu
quelle
3
Irgendwie funktioniert das bei mir nicht ... Ich habe "-transparent-color white" ausprobiert, aber eine Ausnahme / Warnung erhalten.
William Niu
1
Es stellt sich heraus, dass ich den Hintergrund ebenfalls auf Weiß setzen muss. Ich musste auch die Farben.xml herunterladen, die fehlte.
William Niu
9
Schauen Sie sich meine Antwort unten an. Es wurde 2 Jahre nach diesem hinzugefügt.
Rok Kralj
42
Versuchen Sie NICHT , mehrseitige Dokumente mit zu konvertieren -flatten. Dadurch werden die Seiten zu einer Seite zusammengefasst.
Tim S.
8
Wenn Sie dies für alle Dateien aus Ihrem Ordner tun möchten, können Sie dies folgendermaßen mogrify -flatten *.pngtun: Vergessen Sie für alle Fälle nicht, eine Sicherung durchzuführen. Weitere Infos hier: imagemagick.org/script/mogrify.php
troyane
372
-background white -alpha remove -alpha off

Beispiel:

convert image.png -background white -alpha remove -alpha off white.png

Fühlen Sie sich frei, durch whitejede andere Farbe zu ersetzen, die Sie wünschen. Die Imagemagick-Dokumentation sagt Folgendes über die -alpha removeOperation aus:

Dieser Vorgang ist einfach und schnell und erledigt die Aufgabe, ohne dass zusätzlicher Speicherbedarf oder andere Nebenwirkungen erforderlich sind, die mit alternativen Techniken zum Entfernen der Transparenz verbunden sein können. Dies ist daher die bevorzugte Methode zum Entfernen der Bildtransparenz.

Rok Kralj
quelle
3
Scheint -background whitenicht benötigt zu werden (wahrscheinlich jedoch für andere Farben).
Skippy le Grand Gourou
5
@SkippyleGrandGourou: Dies ist erforderlich, da die Transparenz-Fallback-Farbe für PNG nicht immer weiß ist.
Rok Kralj
3
besser als die akzeptierte Antwort (die bei mehr als einer Schicht nicht das Richtige tut)
Axkibe
5
Das resultierende Bild hat weiterhin einen Alphakanal. Es wird leer sein, aber es wird immer noch da sein. Um den Kanal vollständig zu entfernen, fügen Sie hinzu -alpha off.
Josch
2
Funktioniert nicht Ich habe ein neues PNG mit einem transparenten Hintergrund und einem roten Punkt in der Mitte erstellt. Immer einen schwarzen Hintergrund erzeugt, egal welche Farbe ich angegeben habe. convert image.png -background white -alpha off white.pngerzeugte ein Bild mit einem schwarzen Hintergrund. convert image.png -background "#00ff33" -alpha off 00ff33.pngproduzierte einen schwarzen Hintergrund
McNulty
46

Das Abflachen des Bildes und das Anwenden des Hintergrundbilds ist in ImageMagick unkompliziert

Die Reihenfolge der Befehle ist jedoch sehr wichtig

Um einen Hintergrund auf ein transparentes Bild anzuwenden und es zu reduzieren, wenden Sie zuerst den Hintergrund an, bevor Sie ihn reduzieren. Das Gegenteil funktioniert nicht.

$ convert sourceimage.png -background BackgroundColor -flatten destinationimage.png
acpmasquerade
quelle
Aus irgendeinem Grund hat das für mich gut funktioniert. Ich bin mir nicht sicher, warum Ihr ursprünglicher Versuch nicht funktioniert hat.
Anthony
23

Das einzige, was für mich funktioniert hat, war eine Mischung aus allen Antworten:

convert in.png -background white -alpha remove -flatten -alpha off out.png
db0
quelle
4
Cool, das hat funktioniert. Ich brauchte tatsächlich eine andere Farbe als Weiß und Sie können ... -background "#010203" ...anstelle von Weiß verwenden.
Alexis Wilke
Hier ist, wie man das gleiche Bild in allen Ordnern in einem Verzeichnis ersetztmogrify -background white -flatten */*.png
Julian
-alpha removewar es, was es für mich getan hat
Stefan Dragnev
13

So ersetzen Sie dasselbe Bild in allen Ordnern in einem Verzeichnis durch Weiß anstelle von Transparent:

mogrify -background white -flatten */*.png

julianisch
quelle
10

Die Verwendung von -flatten hat mich total verrückt gemacht, weil -flatten in Kombination mit Mogrify-Ernte und Größenänderung einfach nicht funktioniert. Der offizielle und für mich einzig richtige Weg ist, den Alpha-Kanal zu "entfernen".

-alpha entfernen -alpha aus (wird bei JPG nicht benötigt)

Siehe Dokumentation: http://www.imagemagick.org/Usage/masking/#remove

Tjarko Rikkerink
quelle
Wie würde das Kommando werden? Dies hat hier nicht funktioniert:convert imgWithTranspBkg.png -alpha remove -alpha off bkg.jpg resultImg.png
Aquarius Power
Ich wollte nur Alpha entfernen. In JPG konvertieren hat es geschafft, nett und einfach. Danke für den Tipp.
Roger CS Wernersson
Dies ist die einzige Lösung der oben genannten, die für mich funktioniert hat. Jetzt ist der iTunes Store mit meinem Bild zufrieden.
Bill Cheswick
7

Im Abschnitt " Alpha entfernen " des ImageMagick-Verwendungshandbuchs wird die Verwendung der folgenden -alpha removeOption vorgeschlagen, z.

convert in.png  -background white  -alpha remove  out.png

... mit der -backgroundFarbe Ihrer Wahl.

Der Leitfaden besagt:

Dieser Vorgang ist einfach und schnell und erledigt die Aufgabe, ohne dass zusätzlicher Speicherbedarf oder andere Nebenwirkungen erforderlich sind, die mit alternativen Techniken zum Entfernen von Transparenz verbunden sein können. Dies ist daher die bevorzugte Methode zum Entfernen der Bildtransparenz.

Es fügt zusätzlich den Hinweis hinzu:

Beachten Sie, dass der Alphakanal eingeschaltet bleibt, solange die Transparenz entfernt wird, aber jetzt vollständig undurchsichtig ist. Wenn Sie den Alpha-Kanal nicht mehr benötigen, können Sie ihn mit Alpha Off deaktivieren.

Wenn Sie den Alphakanal nicht benötigen, können Sie die Größe Ihres Ausgabebilds verringern, indem Sie die -alpha offOption hinzufügen , z.

convert in.png  -background white  -alpha remove  -alpha off  out.png

Weitere Informationen zu anderen häufig verwendeten Techniken zum Entfernen von Transparenz finden Sie im Abschnitt Entfernen von Transparenz aus Bildern .

In diesem Abschnitt wird eine wichtige Einschränkung für die Verwendung -flattenals Technik zum Entfernen von Transparenz erwähnt:

Dies funktioniert jedoch nicht mit "mogrify" oder mit einer Folge von mehreren Bildern, im Grunde genommen, weil der Operator "-flatten" wirklich dafür ausgelegt ist, mehrere Bilder zu einem einzigen Bild zusammenzuführen.

Wenn Sie also mehrere Bilder gleichzeitig konvertieren, z. B. Miniaturansichten aus einer PDF-Datei erstellen, -flattenwird dies nicht das tun, was Sie möchten (es werden alle Bilder für alle Seiten zu einem Bild reduziert). Andererseits werden bei Verwendung der -alpha removeTechnik immer noch mehrere Bilder erzeugt, von denen jedes die Transparenz entfernt hat.

Gary
quelle
5

Es scheint, dass Ihr Befehl korrekt ist, sodass das Problem möglicherweise auf die fehlende Unterstützung für PNG () zurückzuführen ist. Sie können convert -list configureFolgendes überprüfen oder einfach ausprobieren:

sudo yum install libpng libpng-devel
Alastair
quelle
1
Ja dank; Dieses (alte) Problem war ein Fehler in "Graphicks Magick", der eine Abzweigung / Umschreibung / was auch immer von "Image Magick" ist.
Pointy
@Pointy ich verstehe! Was war aus Neugier die eigentliche Ursache des Problems (das war nur in einer Version)?
Alastair
Nun, ich weiß es wirklich nicht genau. Es war nur ein Fehler. Ich bin kein Betreuer von Graphicks Magick, daher habe ich keinen Einblick in deren Code. Ich muss es irgendwann noch einmal versuchen, denke ich.
Pointy
Ubuntu hat es nicht? Hier ist libpng12-0, funktioniert aber immer noch nicht :(
Aquarius Power
Ich benutze Ubuntu 13.04 mit libpng12-0installiert und funktioniert. Können Sie PNG sehen, wenn Sie dies ausführen? convert -list configure | grep \png
Alastair
5

Dies ist nicht genau die Antwort auf Ihre Frage, aber ich habe Ihre Frage gefunden, als ich versucht habe, herauszufinden, wie der Alphakanal entfernt werden kann. Deshalb habe ich beschlossen, diese Antwort hier hinzuzufügen:

Wenn Sie den Alphakanal mit imagemagick entfernen möchten, können Sie diesen Befehl verwenden:

mogrify -alpha off ./*.png
FreeNickname
quelle
3

Wie es aussieht, hat meine Entscheidung, "Grafikmagie" über "Bildmagie" zu installieren, einige Ecken und Kanten - wenn ich echte alte "Bildmagie" neu installiere, funktioniert der obige Befehl einwandfrei.

lange später bearbeiten - Eines Tages werde ich überprüfen, ob "Graphics Magick" dieses Problem behoben hat.

Spitze
quelle
2

Ich brauchte entweder: beide -alpha backgroundund -flatten, oder -fill.

Ich habe ein neues PNG mit einem transparenten Hintergrund und einem roten Punkt in der Mitte erstellt.

convert image.png -background green -alpha off green.png fehlgeschlagen: Es wurde ein Bild mit schwarzem Hintergrund erstellt

convert image.png -background green -alpha background -flatten green.png erzeugte ein Bild mit dem richtigen grünen Hintergrund.

Bei einer anderen Datei, die ich umbenannt habe image.png, konnte ich natürlich nichts tun. Für diese Datei stellte ich fest, dass die Farbe der transparenten Pixel "# d5d5d5" war, also füllte ich diese Farbe mit Grün:

convert image.png -fill green -opaque "#d5d5d5" green.png ersetzte die transparenten Pixel durch das richtige Grün.

McNulty
quelle
Der richtige Befehl mit dem aktuellen ImageMagick wäre convert image.png -background green -alpha background -alpha off green.pngoder convert image.png -background green -alpha background -alpha remove green.pngoder convert image.png -background green -flatten green.png
fmw42
1

Option ohne Befehlszeile: Öffnen Sie die PNG-Datei in Windows Paint und klicken Sie auf Speichern.

hbere
quelle
0

Dadurch wird ein Bild erstellt, bei dem nur das erste mit Transparenz über dem zweiten platziert wird

composite -gravity center ImgWithTransp.png BackgroundSameSizeOfImg.png ResultImg.png

fand ursprünglich den Tipp auf diesem Beitrag

Wassermann-Kraft
quelle
0

Um tatsächlich den Alpha - Kanal aus der Datei zu entfernen, verwenden Sie die Alpha - off - Option:

convert in.png -background white -alpha off out.png
Nick Dowell
quelle
1
In dem von Ihnen angegebenen Link heißt es tatsächlich: "Der an das Bild angehängte Alphakanal wird nicht gelöscht oder zerstört. Er deaktiviert lediglich alle Auswirkungen, die dieser Kanal auf das Bild hat." Um den Alpha-Kanal wirklich zu entfernen, siehe meine Antwort.
Rok Kralj
0

Ich habe diese Frage und Antworten gesehen, die mir wirklich helfen, aber dann musste ich sie für viele Dateien ausführen. Falls Sie also mehrere Bilder (PNG-Bilder) in einem Ordner haben und dies für alle tun möchten:

find ./ -name "*.png" -exec convert {} -flatten {} \;
Talsibony
quelle
-1

Es ist -alpha aus, NICHT -alpha entfernen! Das Hochladen des iOS App Store schlägt fehl, wenn ein Symbol einen Alphakanal enthält !!

So geht's: mogrify -alpha off * .png

Railsfanatic
quelle