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

Пытаюсь понять формат PNG.

Рассмотрим это изображение PNG:

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

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

enter image description here

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

Фрагмент 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 Editor

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

2 -Кусок :Длина

 00 00 00 0D

3 -Блок :Тип блока

 49 48 44 52

Что такое ИХДР.

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

4 -Фрагмент :Ширина изображения (в десятичном формате 128)

00 00 00 80

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

00 00 00 44

6 -Чанк :ГЛУБИНА БИТ (1 байт)

08

7 -Фрагмент :Тип цвета

02

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

00

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

00

10 -Чересстрочный метод:

00

11 -Что представляют собой следующие данные?

C6 25 AA 3E 00 00 00 C2

12 --ИДАТ

49 44 41 54

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 100 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 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 00 20 00 00 8В 37 ДБ 200 0 00 00

14 -ИЭНД:

49 45 4Е 44

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

 AE 42 60 82

Что это ?

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

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

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

ОБНОВЛЕНИЕ

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

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

11
задан gpuguy 19 June 2012 в 12:18
поделиться