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).
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.
convert original.png -transparent white new.png
aber 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)?