2012-12-25 11 views
8

Voglio convertire png da 32 bit a 8 bit png con ImageMagick, ma i pixel semitrasparenti vanno perduti. Come risolvere questo problema? Il comando che sto usando è la seguenteConversione da 32 bit png a 8 bit png con ImageMagick preservando i pixel semitrasparenti

convert original.png PNG8:output.png 
+0

correlati: http://stackoverflow.com/questions/1468221/can-you-force-imagemagick-to-use-png-8-alpha-transparency –

+2

Questa domanda non è un duplicato. Questo poster si lamenta della perdita di pixel semitrasparenti dopo la conversione da 24 bit a 8 bit.Ha già la sintassi (corretta) per la conversione da 24 bit a 8 bit, si sta chiedendo perché si comporta come fa (e c'è una buona risposta per questo). –

risposta

10

Apparentemente, anche se il formato PNG permette effettivamente qualsiasi e tutti i colori in scala di colore a 8 bit PNG essere completamente o parzialmente trasparente "PNG8" di ImageMagick format specifier supporta solo la trasparenza a 1 bit in stile GIF.

È possibile produrre indicizzati PNG a 8 bit utilizzando ImageMagick da non usando l'PNG8: specificatore, ma semplicemente utilizzando -colors 256 o -colors 255 * per ridurre il numero di colori dell'immagine. Sfortunatamente, almeno sulla base dei miei test con ImageMagick 6.8.9, le immagini risultanti hanno alcuni artefatti di quantizzazione del colore piuttosto bizzarri e abbastanza inutilmente brutti.

Fortunatamente, c'è uno strumento molto migliore per questo specifico lavoro: pngquant. Con esso, la conversione di un RGBA PNG a 32 bit in un 8-bit colormapped PNG con perdita di qualità minima è facile come:

pngquant 256 <original.png> output.png 

Come una rapida dimostrazione, ecco un quadro semplice test (una stella con semitrasparente ombra) convertito a 8-bit PNG utilizzando vari metodi:

Original pngquant 256 ImageMagick convert (-colors 255) ImageMagick convert (PNG8) ImageMagick convert (-colors 255, PNG8)

Da sinistra a destra:

  1. originale a 32 bit RGBA PNG
  2. quantizzato con pngquant 256 <input.png> output.png
  3. quantizzato con convert input.png -colors 255 output.png *
  4. quantizzato con convert input.png PNG8:output.png
  5. quantizzato con convert input.png -colors 255 PNG8:output.png *

*) nei commenti qui sotto, si suggerisce che -colors 255 è necessario "riservare una voce per il colore 'background'." Sulla base dei miei test, non ho osservato che questo è effettivamente il caso; utilizzando -colors 256 sarà ancora produce an 8-bit colormapped PNG, con artefatti di quantizzazione qualitativamente simili, ma diversi nei dettagli, dall'output con -colors 255. Tuttavia, solo per giocare sul sicuro, ho usato -colors 255 per gli esempi sopra. Ridurre la dimensione della mappa di colori di un colore non dovrebbe, di per sé, influire in modo significativo sulla qualità dei risultati, in quanto un test con pngquant 255 sarà demonstrate.

+0

Grazie per la risposta. Ho provato questo comando, ma non conserva i pixel semitrasparenti. – Karmar

+0

Oh bene, valeva la pena provare. :((Salve, hai provato _both_ di loro, giusto? Qualcuno nel thread a cui mi sono collegato ha suggerito che è specificamente il prefisso 'PNG8:' che sta infrangendo la trasparenza alfa.) –

+2

Sì, ho provato entrambi. pixel nero Ho iniziato a utilizzare pngquant command line tool invece di ImageMagick.Prenota correttamente il canale alfa – Karmar

Problemi correlati