2013-03-25 14 views
6

Esiste un modo per convertire un PNG a colori a 16 bit (scala di grigi) in un formato di colore RGBA4444 utilizzando PHP?Colore grezzo 16 bit

OPPURE

C'è un modo per caricare questo PNG in scala di grigi a 16 bit utilizzando il formato RGBA4444?

L'intestazione PNG indica che sta utilizzando il colore a 16 bit (profondità bit) e il colore in scala di grigi (tipo di colore) (http://www.fileformat.info/format/png/corion.htm, intestazione immagine IHDR).

$rgb = imagecolorat($src, $x, $y); 
var_dump("RGB - ".dechex($rgb)); 
$rgba = imagecolorsforindex($src, $rgb); 
var_dump("RGBA - ".dechex($rgba)); 

Il valore di $rgb (per esempio) è A7 mentre $rgba è [A7, A7, A7, 0].

BTW, qui è l'intestazione di detto documento:

89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52 | .PNG........IHDR 
00 00 03 FF 00 00 03 FF 10 00 00 00 00 E3 F9 FF | ................ 
C9 00 00 00 0D 74 45 58 74 44 46 4D 54 00 52 34 | .....tEXtDFMT.R4 
47 34 42 34 41 34 E0 94 BA 92 00 00 20 00 49 44 | G4B4A4........ID 
41 54 .. ..          | AT 

EDIT:

Quello che ho fatto prima è stato seguire questo codice da Charlie (https://stackoverflow.com/a/7293429/2205703). (Naturalmente con alcune modifiche.) Quindi convertire ogni formato di colore a 16 bit (basato su tEXt pezzo) in formato RGBA8888.

Quindi, pack() in formato file PNG. Ma ho ancora errore di immagine.

+0

Si potrebbe semplicemente troncare di colore a 8 bit. Per ottenere risultati migliori, è necessario implementare il dithering o utilizzare una libreria che faccia questo per te. – Brad

risposta

2

La risposta di Brad non è male. Troncare a 8 bit potrebbe essere abbastanza buono con le immagini in scala di grigi. RGBA finirebbe in un'immagine trasparente che probabilmente non è ciò che stai davvero cercando. Hai già provato a convertire in un'immagine a 24 bit a colori? Il risultato sarebbe ancora simile a una scala di grigi che si potrebbe semplicemente ridurre a 8 bit con facilità.

Utilizzando imagick renderebbe questa procedura molto più semplice:

convert source-image.png -evaluate multiply 16 -depth 8 destination-image.png 
+0

ho provato questo imagick, ma è ancora in scala di grigi. quello che penso è che leggerà i dati come scala di grigi a 16 bit (come dice l'intestazione) e poi convertirli in scala di grigi a 8 bit. quello che mi aspetto era di leggere la scala di grigi a 16 bit come r4g4b4a4 (e alcuni file ha a4r4g4b4). ma grazie per la risposta – ReignBough

Problemi correlati