2012-12-25 12 views
8

Ich möchte 32 Bit PNG in 8 Bit PNG mit ImageMagick konvertieren, aber halbtransparente Pixel sind verloren. Wie man dieses Problem löst? Der Befehl, ich bin mit der folgendenKonvertieren von 32 Bit PNG zu 8 Bit PNG mit ImageMagick durch Beibehalten von halbtransparenten Pixeln

convert original.png PNG8:output.png 
+0

In Verbindung stehende: http://StackOverflow.com/Questions/1468221/Can-You-Force-Imagemagick-To-use-Png-8-Alpha-Transparency –

+2

Diese Frage ist kein Duplikat. Dieses Plakat beklagt sich über den Verlust von halbtransparenten Pixeln nach der Konvertierung von 24-Bit auf 8-Bit.Er hat bereits die (korrekte) Syntax zum Konvertieren von 24-Bit in 8-Bit, er fragt sich, warum er sich so verhält (und dafür gibt es eine gute Antwort). –

Antwort

10

Offenbar, obwohl das PNG-Format ermöglicht es eigentlich jede und alle Farben in einem 8-Bit indizierte Farb PNG ganz oder teilweise transparent, ImageMagicks „PNG8“ zu sein format specifier unterstützt nur GIF-artige 1-Bit-Transparenz.

Es ist möglich, indizieren 8-Bit-PNGs von nicht mit dem PNG8: Spezifizierer mit ImageMagick zu produzieren, sondern einfach mit -colors 256 oder -colors 255 * der Anzahl der Farben im Bild zu reduzieren. Leider haben die resultierenden Bilder zumindest auf Grund meiner Tests mit ImageMagick 6.8.9 einige seltsame und ziemlich unnötig hässliche Farbquantisierungsartefakte.

Glücklicherweise gibt es ein viel besseres Werkzeug für diesen speziellen Job: pngquant. Mit ihm Umwandlung eines 32-Bit-RGBA PNG in ein 8-Bit-colormapped PNG mit Verlust minimal Qualität ist so einfach wie:

pngquant 256 <original.png> output.png 

Als schnelle Demonstration, hier ein einfaches Testbild ist (ein Stern mit ein halbdurchlässiger Schlagschatten) umgewandelt zu 8-Bit-PNG verschiedene Methoden verwenden:

Original pngquant 256 ImageMagick convert (-colors 255) ImageMagick convert (PNG8) Quantized mit pngquant 256 <input.png> output.png

  • Quantized mit convert input.png -colors 255 output.png *
  • Quantized mit convert input.png PNG8:output.png
  • Quantized mit convert input.png -colors 255 PNG8:output.png

    1. Original-32-Bit-RGBA PNG
    2. *:

  • Von links nach rechts


    *) In den Kommentaren unten, wird vorgeschlagen, dass -colors 255 notwendig ist „einen Eintrag für die‚Hintergrund‘Farbe zu behalten.“ Basierend auf meinen Tests habe ich nicht beobachtet, dass dies tatsächlich der Fall ist; unter Verwendung -colors 256 wird immer noch produce an 8-bit colormapped PNG, mit Quantisierungsartefakten qualitativ ähnlich, aber in Details von der Ausgabe mit -colors 255 unterscheiden. Nichtsdestotrotz, um auf Nummer sicher zu gehen, habe ich -colors 255 für die obigen Beispiele verwendet. Das Reduzieren der Farbabbildungsgröße um eine Farbe sollte als solches die Qualität der Ergebnisse nicht wesentlich beeinflussen, wie ein Test mit wird demonstrate.

    +0

    Danke für die Antwort. Ich habe diesen Befehl ausprobiert, aber halb transparente Pixel bleiben nicht erhalten. – Karmar

    +0

    Naja, es war einen Versuch wert. :((Ps. Du hast versucht, _both_ von ihnen, richtig? Jemand in dem Thread, den ich verlinkte, schlug vor, dass es speziell das 'PNG8: 'Präfix ist, das die Alphatransparenz bricht.) –

    +2

    Ja, ich habe beide ausprobiert Pixel schwarz. Ich begann mit pngquant Kommandozeilen-Tool anstelle von ImageMagick. Es Alpha-Kanal korrekt zu speichern. – Karmar