Stellen Sie den transparenten Hintergrund mit ImageMagick und der Eingabeaufforderung ein

119

Angenommen, Sie haben ein Bild (PNG oder JPG). Dieses Bild hat einen weißen Hintergrund und ich muss diesen Hintergrund transparent machen.

Ich habe mit diesen Beispielen versucht:

  • convert original.png -background none transparent.png
  • convert original.png -background white -flatten -alpha off transparent.png

aber ohne wünschenswerte Ergebnisse.

Wie kann ich es schaffen?

WICHTIG: Verwenden der convertBefehlszeile.

Israel
quelle
Seltsam - Ich dachte, der relevante Befehl wäre, convert original.png -transparent white new.pngaber wenn ich ihn versuche, kann ich ihn nicht zum Laufen bringen. Sind Sie sicher, dass Ihr Hintergrund tatsächlich weiß ist (#FFFFFF), oder ist er nur fast weiß (z. B. #FEFEFE)?
mathematisch.Kaffee
@ math.coffee Ok Ich verstehe, lass mich überprüfen, ob dies nicht der Fall ist und ich werde diesen Thread fortsetzen. Danke dir.
Israel
@ math.coffee Hallo nochmal, ich habe die Farben überprüft und dieses Bild hat einen Hintergrund wie #FFFFFF, mit anderen Worten "weiß". :( Dies ist nicht der Fall!
Israel

Antworten:

140

Ich verwende ImageMagick 6.6.9-7 unter Ubuntu 12.04.
Was für mich funktioniert hat, war Folgendes:

convert test.png -transparent white transparent.png

Das hat das ganze Weiß in der test.png in transparent geändert.

Rijk
quelle
6
Dies hat bei mir nicht funktioniert, bis mir klar wurde, dass JPG nicht transparent ist. Nachdem ich zu PNG gewechselt war, tat es genau das, was ich wollte - ich musste nur "weiß" in "rgb ($ r, $ g, $ b)" ändern.
Roger Dueck
2
Gottverdammt! das ist toll!
Agilob
2
Dadurch wird nicht nur der Hintergrund in transparent konvertiert, sondern jedes weiße Pixel. Gibt es eine Möglichkeit, den Hintergrund nur in transparent umzuwandeln?
Alejandro Lozdziejski
2
@AlejandroLozdziejski - wie definieren Sie "Hintergrund"?
Jules
1
@AlejandroLozdziejski: Gute Frage. Bitte sehen Sie sich meine Lösung an, bei der eine Flutfüllung an den Rändern verwendet wird und nach Farben gesucht wird, die ungefähr denen des Pixels oben links entsprechen.
Hackerb9
79

Ich hatte das gleiche Problem. In dem ich mit ImageMagick den weißen Hintergrund aus dem JPG / PNG-Bildformat entfernen muss.

Was für mich funktioniert hat war:

1) Konvertieren Sie das Bildformat in PNG: convert input.jpg input.png

2) convert input.png -fuzz 2% -transparent white output.png

Sandeep Pal
quelle
6
Dies ist gut, um eine glattere Kante zwischen transparentem Hintergrund und undurchsichtigem Vordergrund zu haben. Wenn Sie verrauschte Symbole in JPG in PNG konvertieren und Transparenz hinzufügen möchten, können Sie auch eine Medianfilterung hinzufügen:mogrify -format png -median 2 -fuzz 5% -transparent white ico_*.jpg
Tomasz Gandor
44

Lösung

color=$( convert filename.png -format "%[pixel:p{0,0}]" info:- )
convert filename.png -alpha off -bordercolor $color -border 1 \
    \( +clone -fuzz 30% -fill none -floodfill +0+0 $color \
       -alpha extract -geometry 200% -blur 0x0.5 \
       -morphology erode square:1 -geometry 50% \) \
    -compose CopyOpacity -composite -shave 1 outputfilename.png

Erläuterung

Dies ist etwas länger als die zuvor gegebenen einfachen Antworten, liefert jedoch viel bessere Ergebnisse: (1) Die Qualität ist aufgrund von Alpha mit Antialiasing überlegen, und (2) nur der Hintergrund wird entfernt, im Gegensatz zu einer einzelnen Farbe. ("Hintergrund" wird als ungefähr dieselbe Farbe wie das obere linke Pixel definiert, wobei eine Flutfüllung von den Bildrändern verwendet wird.)

Zusätzlich wird der Alphakanal um ein halbes Pixel erodiert, um Lichthöfe zu vermeiden. Natürlich funktionieren die morphologischen Operationen von ImageMagick (noch?) Nicht auf Subpixel-Ebene. Sie können also sehen, dass ich den Alphakanal vor dem Erodieren auf 200% sprenge.

Vergleich der Ergebnisse

Hier ist ein Vergleich des einfachen Ansatzes ("-fuzz 2% -transparent white") mit meiner Lösung, wenn er auf dem ImageMagick-Logo ausgeführt wird . Ich habe beide transparenten Bilder auf einen sattelbraunen Hintergrund abgeflacht, um die Unterschiede sichtbar zu machen (klicken Sie für Originale).

Das einfache Ersetzen von Weiß als transparent funktioniert nicht immer Antialiased Alphachannel und Floodfill sehen viel besser aus

Beachten Sie, wie der Bart des Zauberers bei der einfachen Vorgehensweise verschwunden ist. Vergleichen Sie die Ränder des Assistenten, um zu sehen, wie sich die Figur durch Antialiasing-Alpha nahtlos in den Hintergrund einfügt.

Natürlich gebe ich zu, dass es Zeiten gibt, in denen Sie die einfachere Lösung verwenden möchten. (Zum Beispiel: Es ist verdammt viel einfacher, sich daran zu erinnern, und wenn Sie in GIF konvertieren, sind Sie sowieso auf 1-Bit-Alpha beschränkt.)

mktrans Shell-Skript

Da es unwahrscheinlich ist, dass Sie diesen Befehl wiederholt eingeben möchten, empfehle ich, ihn in ein Skript einzuschließen. Sie können ein BASH-Shell-Skript von github herunterladen , das meine vorgeschlagene Lösung ausführt. Es kann für mehrere Dateien in einem Verzeichnis ausgeführt werden und enthält hilfreiche Kommentare, falls Sie Änderungen vornehmen möchten.

bg_removal-Skript

Übrigens enthält ImageMagick tatsächlich ein Skript namens "bg_removal" , das Floodfill auf ähnliche Weise wie meine Lösung verwendet. Die Ergebnisse sind jedoch nicht großartig, da immer noch 1-Bit-Alpha verwendet wird. Außerdem läuft das Skript bg_removal langsamer und ist etwas schwieriger zu verwenden (Sie müssen zwei verschiedene Fuzz-Werte angeben). Hier ist ein Beispiel für die Ausgabe von bg_removal.

Das Skript bg_removal: hat Bart, aber kein Antialiasing

hackerb9
quelle
2
Ich musste den Flaum auf 2% ändern, da das Bild eine weiße Maschine mit weißem Hintergrund enthält. Und obwohl dies nicht 100% perfekt ist, ist es die beste Lösung, die ich gefunden habe, da ich es nicht manuell gimpoder was auch immer machen möchte . :)
Tukusejssirs
1
Tolle Lösung!
0x01h
29

Das funktioniert bei mir:

convert original.png -fuzz 10% -transparent white transparent.png

Je kleiner der Fuzz%, desto näher am echten Weiß oder umgekehrt, desto größer der%, desto mehr Abweichungen vom Weiß können transparent werden

Ricibald
quelle
1
Beeindruckend! Genau das brauchte ich! vor: i.imgur.com/2Rd7w1N.png , nach: i.imgur.com/4RTYygo.png
Dorian
Es funktioniert nicht perfekt, da es keine Bilder mit weißer Farbe und weißem Hintergrund verarbeiten kann. wie Trumpffotos.
Sr. PHP Programmer Teamleiter
Verwenden Sie für Weiß auf Weiß die oben angegebene Flutfülllösung . Oder verwenden Sie mein mktransShell-Skript: github.com/hackerb9/mktrans
hackerb9
12

Sie können dies verwenden, um den Hintergrund transparent zu machen

convert test.png -background rgba(0,0,0,0) test1.png

Das Obige gibt dem Präfekten einen transparenten Hintergrund

Sanat Kumar Panda
quelle
4
Die Shell könnte einige Zitate erfordern von (): convert more-icon.png -gravity center -background 'rgba(0,0,0,0)' -extent 27x27 new-more-icon.png
Jim K.
7

Mit ImageMagick ist dies dem Hackerb9-Code und dem Ergebnis sehr ähnlich, jedoch eine etwas einfachere Befehlszeile. Es wird davon ausgegangen, dass das obere linke Pixel die Hintergrundfarbe ist. Ich fülle den Hintergrund einfach mit Transparenz, wähle dann den Alphakanal aus, verwische ihn und entferne die Hälfte des unscharfen Bereichs mit -x 50x100%. Schalten Sie dann alle Kanäle wieder ein und drücken Sie sie gegen die braune Farbe flach. Die -blur 0x1-Ebene 50x100% wirkt gegen die Grenzen der Alphakanaltransparenz. Sie können den Fuzz-Wert, die Unschärfemenge und den 50% -Wert anpassen, um den Grad des Antialiasing zu ändern.

convert logo: -fuzz 25% -fill none -draw "matte 0,0 floodfill" -channel alpha -blur 0x1 -level 50x100% +channel -background saddlebrown -flatten result.jpg

Geben Sie hier die Bildbeschreibung ein

fmw42
quelle
Nett. Ich mag es, dass Sie das Wesentliche in einer kurzen Linie verstanden haben. Dies ähnelt einem meiner Zwischenschritte beim Schreiben des Skripts. Ich habe mich dagegen entschieden, weil (a) es zu viele scharfe Details verliert, (b) ich die Farbauswahl offensichtlich machen wollte, damit sie leicht geändert werden kann, und (c) ich wollte von allen Kanten, nicht nur von oben, überfluten -linke Ecke. (Es kann andere Dinge geben, die ich gerade vergesse).
Hackerb9
2
PS Ich gehe davon aus, dass "fmw" für Fred M. Weinhaus steht. Dann Grüße, Dr. Weinhaus! Für jeden, der nicht weiß, wer er ist, schrieb er einige der wegweisenden Forschungen in der Computergrafik ab den 1970er Jahren. Jeder sollte sich unter fmwconcepts.com/imagemagick seine erstaunliche Zusammenstellung von ImageMagick-Shell-Skripten ansehen .
Hackerb9
1
@ Hackerb9: Ja, das bin ich. Kennen wir uns? Senden Sie mir eine E-Mail, wenn Sie möchten. Meine E-Mail-Adresse befindet sich auf meiner von Ihnen verlinkten Webseite.
FMW42
4

Wenn Sie den Transparenzgrad steuern möchten, können Sie rgba verwenden. wo a das Alpha ist. 0 für transparent und 1 für undurchsichtig. Stellen Sie sicher, dass die endgültige Ausgabedatei aus Gründen der Transparenz die Erweiterung .png haben muss.

convert 
  test.png 
    -channel rgba 
    -matte 
    -fuzz 40% 
    -fill "rgba(255,255,255,0.5)" 
    -opaque "rgb(255,255,255)" 
       semi_transparent.png
Gokul NK
quelle
1

Ja. Hatte das gleiche Problem auch. Hier ist der Befehl, den ich ausgeführt habe und der perfekt funktioniert hat: convert transparent-img1.png transparent-img2.png transparent-img3.png -channel Alpha favicon.ico

stacigh
quelle