Попытка извлечь значения пикселей из данного изображения PNG
Пытаясь понять формат PNG.
Рассмотрите это изображение PNG:
Изображение взято отсюда
В 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:
Я пытаюсь реконструировать это изображение, чтобы извлечь часть заголовка и значения пикселей 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-Chunk: тип Chunk
49 48 44 52
Который является IHDR.
http://www.w3.org/TR/PNG-Chunks.html
4- Chunk: ширина изображения (в десятичном формате 128)
00 00 00 80
5- Chunk: высота изображения (в десятичном виде 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 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 2 C 08F 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
14- IEND:
49 45 4E 44
1 5- последние 4 байта
AE 42 60 82
Что это?
Может ли кто-нибудь помочь мне понять пункты 11, 13 и 1 5 выше? И где значения пикселей? Изображение имеет (128 х 68 пикселей)
Цель знать эти детали:
Как только я узнаю эти детали, я сгенерирую свое собственное 16-битное изображение PNG. У меня уже есть значения пикселей, поэтому моя работа заключается в том, чтобы вводить заголовки и т. Д.
Я не знаю, есть ли программное обеспечение, которое может выполнить эту работу.
ОБНОВИТЬ
Теперь я понимаю, что из-за сжатия я не смог бы найти значения пикселей.
У меня появилась идея, что я могу написать файл в OpenCV и сохранить его как png. Хорошо, теперь мой прямой вопрос: у меня есть двоичный файл, имеющий 16-битные значения оттенков серого. Могу ли я написать это в OpenCV как 16-битный PNG?
3 ответа
Хотя было бы интересно узнать, что на самом деле представляют собой PNG-изображения и как изображение на самом деле представлено в файле, вам не нужно знать это для создания PNG-файла.
Обратите внимание, что PNG использует сжатие без потерь, что означает, что вы не получите два байта на пиксель.
Вы можете сгенерировать ваше изображение в программе и вывести его в формате PNG, используя множество библиотек, которые там есть. Например, вы можете сделать свое изображение в OpenCV и затем вывести его с imWrite
, Один из параметров может сделать его выводом в PNG.
Если у вас есть 16-битные значения оттенков серого, вы можете поместить их в Mat
,
Затем преобразуйте это в IplImage: Преобразование cv::Mat в IplImage*
Затем вы можете вывести его в файл.
Я не выглядел слишком осторожно, но глядя на структуру...
Q11. C6 25 AA 3E = CRC32 00 00 00 C2 = размер следующего куска
Q13. проверьте спецификацию png, на которую вы ссылались ранее, которая выглядит как кусок IDAT, вы уже знаете, какое сжатие применено к нему!
Q15. AE 42 60 82 = CRC32
Просто для полноты (ответ Eboix прямо на месте)
11- Каковы следующие данные?
C6 25 AA 3E 00 00 00 C2
Каждый блок заканчивается CRC (4 байта) и начинается с 4 байтов, которые указывают его длину. Так, C6 25 AA 3E
является CRC предыдущего чанка (IHDR) и 00 00 00 C2
(194) - длина следующего (IDAT) чанка.
Таким же образом последние 4 байта являются CRC блока IEND.