Понимание изображения (его шестнадцатеричные значения)

Я пытаюсь понять шестнадцатеричные значения файла изображения PNG размером 10 x 10 пикселей.

Например: я использую это изображение http://www.sweethome3d.com/blog/common/images/feed-icon-10x10.png?. Я открыл его в Sublime Text 2 и увидел следующие значения

8950 4e47 0d0a 1a0a 0000 000d 4948 4452
0000 000a 0000 000a 0806 0000 008d 32cf
bd00 0000 0467 414d 4100 00af c837 058a
e900 0000 1974 4558 7453 6f66 7477 6172
6500 4164 6f62 6520 496d 6167 6552 6561
6479 71c9 653c 0000 0167 4944 4154 78da
2c90 3b48 1c51 1885 bf7b 6766 5d7c 63a1
ae5a 180b 9140 086a 213e 106c 042b c1c6
5641 49bb 8d8d 76a6 491b d248 40d2 2888
a585 2058 a960 a168 a128 be90 557c e26b
d575 7667 e6de 9b99 5d8b c3df 7cff 3987
23ce 26be 8dc4 9dd8 3fa7 c8c1 7244 2889
0caf b40b 0a7c c5f3 7d66 545c 4db6 1bbb
ac9a 928e 41cc c331 3ab5 8e15 fb7c 0841
6109 dc77 b023 27bb a29c f8d7 3eac 9a1f
98dc 1bc1 f62c e660 310f a99c 469a 9089
e2c4 c72d eeca 34d2 bda5 a873 1ca7 3b89
ae6e c65b fd89 9751 686d 45a0 c46e 68a1
6478 06f3 7683 dafc 8d7a 39c5 ea9d c29c
6ee3 6f2d 6144 e81a 15e7 6e97 dcdc 10e6
e904 bbff 172a f38a b7b3 10ba 8f11 b8aa
101f 15b6 abea 717a 9298 9365 f4f9 1a76
5792 8f8d 7964 651d b2ae 0de5 9b02 282b
13c8 c65e 681a c05d ff8b ac48 1064 35ea
e91a e74b 7b1e 14af 7fba 4dbc d8a0 abbe
e35d 1ee1 3da7 11b5 ad64 cf0f a134 819f
4e63 b20f c868 cc68 273f b58f 7273 61f1
18fe c51e 681f f598 ca43 ca09 46ff 0b30
0081 6599 b7e4 9326 ee00 0000 0049 454e
44ae 4260 82

Я намереваюсь отобразить это конкретное изображение на светодиодной матрице, и прежде чем перейти к отображению его на светодиодной матрице, я намерен разработать программу, которая может декодировать файл png и использовать его значения RGB для программирования светодиодов. Пожалуйста, объясните, как я понимаю приведенные выше значения и извлекаю значение RGB каждого пикселя.

Спасибо.


person stuartnox    schedule 30.05.2015    source источник
comment
Откуда вы берете файл? Можете ли вы вместо этого получить файл в формате NetPBM PPM - его НАМНОГО проще декодировать. Или используйте ImageMagick для преобразования PNG в PPM, используя convert image.png image.ppm   -  person Mark Setchell    schedule 30.05.2015
comment
Вам не приходило в голову, что в сети может быть какая-то спецификация? Это указано в теге.   -  person Jongware    schedule 31.05.2015
comment
Я предлагаю здесь формат PPM P6 или P3... en.m.wikipedia.org /wiki/Netpbm_format#PPM_example Если вам нужен несжатый, удобочитаемый формат P3, используйте эту команду ImageMagick convert input.png -compress none output.ppm. Если вам нужен формат P6, опустите -compress none   -  person Mark Setchell    schedule 31.05.2015


Ответы (2)


Шестнадцатеричный дамп PNG на самом деле не читается человеком. «од» подходит ближе:

od -c *.png
0000000 211   P   N   G  \r  \n 032  \n  \0  \0  \0  \r   I   H   D   R
0000020  \0  \0  \0  \n  \0  \0  \0  \n  \b 006  \0  \0  \0 215   2 317
0000040 275  \0  \0  \0 004   g   A   M   A  \0  \0 257 310   7 005 212
0000060 351  \0  \0  \0 031   t   E   X   t   S   o   f   t   w   a   r
0000100   e  \0   A   d   o   b   e       I   m   a   g   e   R   e   a
0000120   d   y   q 311   e   <  \0  \0 001   g   I   D   A   T   x 332
0000140   , 220   ;   H 034   Q 030 205 277   {   g   f   ]   |   c 241
....
0000660 030 376 305 036   h 037 365 230 312   C 312  \t   F 377  \v   0
0000700  \0 201   e 231 267 344 223   & 356  \0  \0  \0  \0   I   E   N
0000720   D 256   B   ` 202

Первая строка — это 8-байтовая сигнатура PNG, 4-байтовое число 13 (длина фрагмента IHDR), «IHDR».

Вторая строка — это 13 байтов данных IHDR (ширина, высота, битовая глубина, тип цвета и т. д.), за которыми следует 4-байтовый CRC (циклический контроль избыточности).

Третья строка представляет собой фрагмент gAMA длиной 4 байта (4), "gAMA", 4-байтовым значением гаммы и 4-байтовым CRC.

Четвертая и пятая строки содержат фрагмент tEXt, идентифицирующий программное обеспечение, создавшее PNG, с длиной 4 байта, 4-байтовым именем фрагмента «tEXt», текстом, затем 4-байтовым CRC.

Следующая строка начинается с фрагмента IDAT, который содержит представление пикселей, сжатое с помощью zlib, опять же длиной 4 байта.

Последние две строки содержат CRC для фрагмента IDAT, за которым следует фрагмент IEND, отмечающий конец PNG: 0000 — длина данных, IEND — имя фрагмента, а 256 B `202 — четырехбайтный CRC для IEND. кусок.

Все это объясняется в спецификации формата PNG, которую вы можете прочитать по адресу http://www.w3.org/TR/PNG

Я поддерживаю рекомендацию Марка Сетчелла преобразовать файл в тривиальный формат PPM, а затем работать с ним; это то, что я обычно делаю, хотя я хорошо знаком с PNG и libpng.

Вот как выглядит ваше изображение в PPM:

convert *.png -compress none ppm:-
P3
10 10
255
221 117 45 229 122 51 234 129 56 237 134 57 240 139 59 242 144 60 244 148 61 246 152 62 242 147 59 225 125 48 
229 122 51 233 135 73 244 190 152 243 170 114 241 139 53 244 145 54 247 150 56 249 154 57 250 157 58 241 145 58
[8 more long lines omitted]

Это просто "P3" (означает формат RGB, ASCII); 10 10 (ширина, высота); 255 (максимальное значение интенсивности для каждого канала); R G B R G B R G B.... пока не будут переданы все 100 пикселей RGB

Обратите внимание, что альфа-канал, если он присутствует, теряется при преобразовании в PPM. Вы можете конвертировать в формат PAM NETPBM http://en.m.wikipedia.org/wiki/Netpbm#PAM_graphics_format, который похож на PPM, но был расширен за счет включения альфа-канала (непрозрачности) (но, к сожалению, неудобочитаемым для человека) или формата TXT от ImageMagick; который поддерживает альфу, но довольно многословен:

convert *.png txt:-
# ImageMagick pixel enumeration: 10,10,255,srgba
0,0: (221,117,45,0.376471)  #DD752D60  srgba(221,117,45,0.376471)
1,0: (229,122,51,1)  #E57A33  srgba(229,122,51,1)
2,0: (234,129,56,1)  #EA8138  srgba(234,129,56,1)
etc., through
7,9: (226,113,53,1)  #E27135  srgba(226,113,53,1)
8,9: (223,109,49,1)  #DF6D31  srgba(223,109,49,1)
9,9: (220,114,45,0.376471)  #DC722D60  srgba(220,114,45,0.376471)

Другое полезное приложение — «pngcheck», которое выводит список фрагментов PNG и проверяет их CRC на наличие ошибок:

pngcheck -v *.png
File: feed-icon-10x10.png (469 bytes)
  chunk IHDR at offset 0x0000c, length 13
    10 x 10 image, 32-bit RGB+alpha, non-interlaced
  chunk gAMA at offset 0x00025, length 4: 0.45000
  chunk tEXt at offset 0x00035, length 25, keyword: Software
  chunk IDAT at offset 0x0005a, length 359
    zlib: deflated, 32K window, maximum compression
  chunk IEND at offset 0x001cd, length 0
person Glenn Randers-Pehrson    schedule 30.05.2015

Прочитав ваше изображение и проанализировав байты в соответствии с официальной спецификацией, вы действительно получите что-то вроде дамп в конце.

сжатая часть IDAT была распакована здесь моей утилитой дампа, поэтому вы можете увидеть различные фильтры строк (на этом изображении используются Sub, Up и Paeth), за которыми следуют 4 значения для каждого пикселя в порядке Красный, зеленый, синий, альфа. Вы можете видеть, что все значения альфа-канала равны FF (полностью непрозрачны), за исключением угловых пикселей, где они равны 60 (прозрачность 62%).

Для распаковки фрагмента IDAT (и некоторых других сжатых фрагментов) требуется реализация алгоритма deflate (ссылка на него есть в официальной спецификации).

Сообщается, что CRC присутствуют в файле (я заметил, что эта утилита на самом деле не проверяет их, мне нужно добавить это через какое-то время).

Если вы хотите использовать оригинальные PNG-файлы в качестве входных данных, вам необходимо (а) уметь находить, читать и понимать официальные спецификации, (б) хорошо разбираться в терминах компьютерных изображений, таких как как оттенки серого, индексированные, палитра, гамма, чересстрочная развертка, фильтрация, альфа-канал и RGB, (c) понимают deflate в достаточной степени, чтобы интегрировать существующую реализацию в ваш собственный исходный код (что я и сделал, вместо того, чтобы идти на лишнюю милю и написать с нуля) и (г) объединить всю эту информацию в абстрактную модель, подходящую для преобразования данных в ваш выходной формат.

Или вы можете пропустить все это и использовать libpng.

File: test.png
Header 0x89 "PNG" CR LF ^Z LF checks out okay

block:  "IHDR", 13 bytes [49484452]
Width:              10
Height:             10
Bit depth:          8
Color type:         6 = Color + Alpha
(Bits per pixel: 8)
(Bytes per pixel: 4)
Compression method: 0
Filter method:      0
Interlace method:   0 (none)
number of row filters: 10
  [CRC: 8D32CFBD]

block:  "gAMA", 4 bytes [67414D41]
00 00 AF C8
  [CRC: 37058AE9]

block:  "tEXt", 25 bytes [74455874]
53 6F 66 74 77 61 72 65 00 41 64 6F 62 65 20 49 6D 61 67 65 52 65 61 64 79                      | Software.Adobe ImageReady
  [CRC: 71C9653C]

block:  "IDAT", 359 bytes [49444154]
expanded result: 410 (as expected)
(Row   0 Filter:1)
(Row   1 Filter:1)
(Row   2 Filter:4)
(Row   3 Filter:4)
(Row   4 Filter:4)
(Row   5 Filter:2)
(Row   6 Filter:2)
(Row   7 Filter:2)
(Row   8 Filter:1)
(Row   9 Filter:2)
DD 75 2D 60 E5 7A 33 FF EA 81 38 FF ED 86 39 FF F0 8B 3B FF F2 90 3C FF F4 94 3D FF F6 98 3E FF F2 93 3B FF E1 7D 30 60 
E5 7A 33 FF E9 87 49 FF F4 BE 98 FF F3 AA 72 FF F1 8B 35 FF F4 91 36 FF F7 96 38 FF F9 9A 39 FF FA 9D 3A FF F1 91 3A FF 
EA 37 05 FF EE 46 13 FF FC B1 8A FF FF C1 D9 FF FE A3 65 FF FA 6F 02 FF F9 45 AC FF FA 48 AD FF F7 41 AB FF F3 40 B0 FF 
ED 05 01 FF EF FB FB FF F3 B4 7D FF F5 B8 C1 FF FC DC CA FF FF DE D5 FF FD F4 FB FF F7 B0 7E FF F1 A5 7B FF EF A3 7E FF 
F0 05 02 FF F4 17 23 FF FF 6E BB FF FE 61 A8 FF FB 28 39 FF FC 18 15 FF FF 56 90 FF F6 32 4A FF EC FD FC FF EB FE FA FF 
F2 0A 03 FF F4 00 F2 FF F8 12 0D FF FD 4F 83 FF FF 6E C1 FF F9 0D 07 FF F9 24 38 FF FD 6B AE FF E8 F4 F9 FF E8 F7 F8 FF 
F4 0E 04 FF F8 12 0D FF FD 4E 7D FF FC 2A 39 FF FD 4D 83 FF FD 47 77 FF EF E8 DD FF FF 7B C8 FF EA 0E 2B FF E5 F2 F7 FF 
F6 12 05 FF FA 22 26 FF FF 6E BB FF FC 4C 82 FF F4 10 1D FF FF 56 90 FF EB E0 DB FF FC 69 AE FF EF 2F 5E FF E2 ED F6 FF 
F2 93 3B FF FA 9D 3A FF F8 AF 69 FF F2 92 42 FF EC 81 33 FF ED 99 64 FF E5 78 3B FF E5 84 54 FF E0 75 45 FF DF 6D 31 FF 
E1 7D 30 60 F1 91 3A FF F3 90 3D FF EF 89 3B FF EB 82 39 FF E8 7B 37 FF E5 76 36 FF E2 71 35 FF DF 6D 31 FF DC 72 2D 60 
  [CRC: E49326EE]

block:  "IEND", 0 bytes [49454E44]
  [CRC: AE426082]
person Jongware    schedule 31.05.2015