2012-06-19 5 views
11

Попытка понять формат PNG.Пытается извлечь значения пикселей из заданного изображения PNG

Рассмотрим PNG Image:

enter image description here

Изображение взято из here

В Hex Editor, это выглядит следующим образом:

89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52 00 00 00 80 00 00 00 44 08 02 00 00 00 
C6 25 AA 3E 00 00 00 C2 49 44 41 54 78 5E ED D4 81 06 C3 30 14 40 D1 B7 34 DD FF FF 6F 
B3 74 56 EA 89 12 6C 28 73 E2 AA 34 49 03 87 D6 FE D8 7B 89 BB 52 8D 3B 87 FE 01 00 80 
00 00 10 00 00 02 00 40 00 00 08 00 00 01 00 20 00 00 04 00 80 00 00 10 00 00 02 00 40 
00 00 08 00 00 01 00 20 00 00 00 D4 5E 6A 64 4B 94 F5 98 7C D1 F4 92 5C 5C 3E CF 9C 3F 
73 71 58 5F AF 8B 79 5B EE 96 B6 47 EB F1 EA D1 CE B6 E3 75 3B E6 B9 95 8D C7 CE 03 39 
C9 AF C6 33 93 7B 66 37 CF AB BF F9 C9 2F 08 80 00 00 10 00 00 02 00 40 00 00 08 00 00 
01 00 20 00 00 04 00 80 00 00 10 00 00 02 00 40 00 00 08 00 00 01 00 20 00 00 8C 37 DB 
68 03 20 FB ED 96 65 00 00 00 00 49 45 4E 44 AE 42 60 82 

Эквивалентные символы:

‰PNG........IHDR...€...D.....Æ%ª>...ÂIDATx^íÔ..Ã[email protected]Ñ·4Ýÿÿo³tVê‰.l(sâª4I.‡ÖþØ{‰ 
»R.;‡þ..€[email protected] ....€[email protected] ...Ô^jdK”õ˜|Ñô’\\>Ïœ?sqX_¯ 
‹y[î–¶GëñêÑζãu;湕.ÇÎ.9ɯÆ3“{f7Ï«¿ùÉ/.€[email protected] ....€[email protected] ..Œ7Ûh. 
ûí–e....IEND®B`‚ 

То же самое показано на следующем снимке экрана HEX редактор:

enter image description here

Я пытаюсь перепроектировать это изображение, чтобы извлечь часть заголовка и значения пикселей RGB. Я читал о PNG, а также here, и до сих пор я заметил следующее об этом изображении:

Кусок IHDR должен появиться ПЕРВЫЙ. Он содержит:

Width:    4 bytes 
Height:    4 bytes 
Bit depth:   1 byte 
Color type:   1 byte 
Compression method: 1 byte 
Filter method:  1 byte 
Interlace method: 1 byte 

Ниже я начинаю чтение HEX данных в последовательности:

1- Первый 8-байт: Это 8-байтовое подпись

89 50 4E 47 0D 0A 1A 0A 

Эквивалентно это:% PNG, как видно из редактора HEX

Допустимое изображение PNG должно содержать IHDR кусок, один или несколько фрагментов IDAT и кусок IEND.

2- Чанк: Длина

00 00 00 0D 

3-Чанк: Кусок Тип

49 48 44 52 

Который IHDR.

http://www.w3.org/TR/PNG-Chunks.html

4- Чанк: Ширина изображения (в десятичной системе 128)

00 00 00 80 

5- Чанк: Высота изображения (в десятичном 68)

00 00 00 44 

6- Chunk: BIT DEPTH (1 байт)

08 

7- Чанк: Тип Цвет

02 

8- Метод сжатия

00 

9- Метод фильтра:

Метод

10- чересстрочная:

00 

11- Что такое следующие данные?

C6-25 АА 3E 00 00 00 С2

12-- IDAT

13- Что эти данные (после IDAT):

78 5E ED D4 81 06 C3 30 14 40 D1 B7 34 DD FF FF 6F B3 74 56 EA 89 12 6C 28 73 E2 AA 34 49 03 87 D6 FE D8 7B 89 BB 52 8D 3B 87 FE 01 00 80 00 00 10 00 00 02 00 40 00 00 08 00 00 01 00 20 00 00 04 00 80 00 00 10 00 00 02 00 40 00 00 08 00 00 01 00 20 00 00 00 D4 5E 6A 64 4B 94 F5 98 7C D1 F4 92 5C 5C 3E CF 9C 3F 73 71 58 5F AF 8B 79 5B EE 96 B6 47 EB F1 EA D1 CE B6 E3 75 3B E6 B9 95 8D C7 CE 03 39 C9 AF C6 33 93 7B 66 37 CF AB BF F9 C9 2F 08 80 00 00 10 00 00 02 00 40 00 00 08 00 00 01 00 20 00 00 04 00 80 00 00 10 00 02 00 00 40 00 00 08 00 00 01 00 20 00 00 37 8C DB 68 03 20 FB ED 96 65 00 00 00 00

14- IEND:

49 45 4E 44

15- Последние 4 байта

AE 42 60 82 

Что это?

Может кто-нибудь помочь мне понять, пункты 11, 13 и 15 выше? И где значения Pixel? Изображение, имеющий (128 х 68 пикселей)

Цель знания этих деталей:

После того, как я знаю, что эти детали, я генерировать свой собственный 16 битный PNG изображение. У меня уже есть значения пикселей, поэтому моя задача - ввести заголовки и т. Д.
Я не знаю, есть ли программное обеспечение, которое может выполнять эту работу.

UPDATE

теперь я понимаю, из-за сжатия, я не смог бы найти значения пикселей.

У меня возникла мысль, что я могу написать файл в OpenCV и сохранить его как png. Ну, теперь мой прямой вопрос: у меня есть файл двоичный файл, имеющий 16-разрядные значения по шкале серого. Могу ли я написать это в OpenCV как 16-битный PNG?

ответ

3

Хотя может быть интересно узнать, какие изображения PNG на самом деле и как изображение фактически представлено в файле, вам не нужно знать это, чтобы сгенерировать PNG-файл.

Обратите внимание, что PNG использует сжатие без потерь, что означает, что вы не получите два байта на пиксель.

Вы можете сгенерировать свое изображение в программе и вывести его в формате PNG, используя многие из библиотек, которые там есть. Например, вы можете сделать свое изображение в OpenCV, а затем вывести его с помощью imWrite. Один из параметров может выводить его на PNG.


Если у вас есть полутоновых 16-разрядные значения пикселей, то вы можете поместить их в Mat.

Затем преобразуйте что к IplImage: Converting cv::Mat to IplImage*

Затем вы можете вывести его в файл.

+0

Я только что заметил об компрессии, поэтому его штраф я бы не получил точные значения пикселей. Но можете ли вы рассказать мне о 11 и 15? – gpuguy

+0

Спасибо, ваш ответ очень полезен для меня. Я проверю его, а затем опубликую результат. – gpuguy

+3

+1 Но я не совсем согласен с тем, что «вы просто потратили впустую свое время». Изучение внутренних функций PNG может не понадобиться для вашей текущей задачи, но, тем не менее, оно учится. – leonbloy

3

Просто для полноты (ответ eboix является прямо на месте)

11- Что такое следующие данные?

C6-25 АА 3E 00 00 00 С2

Каждый блок заканчивается CRC (4 байта), и начинается с 4 байта, которые говорят его длину. Итак, C6 25 AA 3E - это CRC предыдущего блока (IHDR) и 00 00 00 C2 (194) - это длина следующего (IDAT) фрагмента.

Таким же образом последние 4 байта являются CRC блока IEND.

3

Я не смотрел слишком тщательно, но смотреть на структуру ...

Q11. C6 25 AA 3E = CRC32 00 00 00 C2 = Размер следующего блока

Q13. Проверьте спецификацию png, о которой вы говорили ранее, которая похожа на фрагмент IDAT, который вы уже знаете, применяемое к нему сжатие!

Q15. AE 42 60 82 = CRC32

 Смежные вопросы

  • Нет связанных вопросов^_^