2013-03-25 10 views
6

Czy istnieje sposób na konwersję 16-bitowego (odcienie szarości) kolorowego PNG na format koloru RGBA4444 przy użyciu PHP?PHP raw 16bit kolor

LUB

Czy istnieje sposób, aby załadować 16-bitowej skali szarości w formacie PNG RGBA4444?

Nagłówek PNG mówi, że używa 16-bitowego koloru (Głębokość) i skali szarości (Typ koloru) (http://www.fileformat.info/format/png/corion.htm, Nagłówek obrazu IHDR).

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

Wartość $rgb (na przykład), gdy jest A7$rgba jest [A7, A7, A7, 0].

BTW, oto nagłówek wspomnianego pliku:

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:

co zrobiłem pierwszy było śledzić ten kod Charlie (https://stackoverflow.com/a/7293429/2205703). (Oczywiście przy pewnych modyfikacjach). Następnie przekonwertuj każdy 16-bitowy format kolorów (oparty na porcji tEXt) na format RGBA8888.

Następnie, pack() je do formatu pliku PNG. Ale wciąż mam błąd obrazu.

+0

Można po prostu Przybliżenie do 8-bitowego koloru. Aby uzyskać lepsze wyniki, trzeba zaimplementować dithering lub skorzystać z biblioteki, która robi to za Ciebie. – Brad

Odpowiedz

2

Odpowiedź Brada jest niezła. Obcięcie do 8 bitów może być wystarczająco dobre dla obrazów w skali szarości. RGBA zakończyłby się przezroczystym obrazem, który prawdopodobnie nie jest tym, czego naprawdę szukasz. Czy już próbowałeś przekonwertować na pełnokolorowy obraz 24-bitowy? Wynik wciąż będzie wyglądał jak skala szarości, którą można łatwo zredukować do 8 bitów z łatwością.

Korzystanie Imagick by uczynić tę procedurę znacznie prostsze:

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

Testowałem ten obraz, ale nadal jest on w skali szarości. myślę, że odczyta dane jako 16-bitową skalę szarości (jak mówi nagłówek), a następnie przekształci ją w 8-bitową skalę szarości. spodziewałem się, że odczyta 16-bitową skalę szarości jako r4g4b4a4 (a niektóre pliki mają a4r4g4b4). ale dziękuję za odpowiedź – ReignBough