【问题标题】:Understanding image (its hex values)了解图像(其十六进制值)
【发布时间】:2015-05-30 19:17:57
【问题描述】:

我正在尝试了解 10 x 10 像素 png 图像文件的十六进制值。

例如:我正在使用这张图片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

我打算在 LED 矩阵上显示这个特定的图像,在继续在 LED 矩阵上显示它之前,我打算开发一个可以解码 png 文件并使用其 RGB 值对 LED 进行编程的程序。请解释我如何理解上述值并提取每个像素的 RGB 值。

谢谢。

【问题讨论】:

  • 你从哪里得到文件?您能否改为以NetPBM PPM 格式获取文件 - 解码更简单。或者使用 ImageMagick 将 PNG 转换为 PPM,使用 convert image.png image.ppm
  • 您没有想到网上可能有一些规范?标签中提到了。
  • 我建议在这里使用PPM P6 或 P3 格式...en.m.wikipedia.org/wiki/Netpbm_format#PPM_example 如果您想要未压缩的、人类可读的 P3 格式,请使用此 ImageMagick 命令convert input.png -compress none output.ppm。如果您想要 P6 格式,请省略 -compress none

标签: png pixel


【解决方案1】:

PNG 的十六进制转储并不是真正的人类可读的。 “od”更近了:

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 字节 gamma 值和 4 字节 CRC

第四行和第五行包含一个 tEXt 块,用于标识创建 PNG 的软件,具有 4 字节长度、4 字节块名称“tEXt”、文本,然后是 4 字节 CRC。

下一行开始包含像素的 zlib 压缩表示形式的 IDAT 块,同样具有 4 字节长度。

最后两行包含 IDAT 块的 CRC,后跟一个 IEND 块来标记 PNG 的结束:0000 是数据长度,IEND 是块名称,256 B ` 202 是四字节的 CRC对于 IEND 块。

所有这些都在 PNG 格式规范中进行了解释,您可以在 http://www.w3.org/TR/PNG 阅读该规范

我赞同 Mark Setchell 的建议,将文件转换为普通的 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 像素

请注意,alpha 通道(如果存在)会在转换中丢失 到 PPM。您可以转换为 NETPBM 的 PAM 格式 http://en.m.wikipedia.org/wiki/Netpbm#PAM_graphics_format,它类似于 PPM,但已扩展为包含 alpha(不透明)通道(但不幸的是不是人类可读的),或者改为 ImageMagick 的 TXT 格式;支持 alpha 但非常冗长:

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

【讨论】:

    【解决方案2】:

    根据official specification读取图像并解析字节,你确实会得到类似于最后的转储的东西。

    压缩 IDAT 部分已由我的转储实用程序在此处解压缩,因此您可以看到各种行过滤器(此图像使用 Sub、Up 和 Paeth),然后是 4 个值每个像素按红色、绿色、蓝色、Alpha 的顺序排列。你可以看到 alpha 值都是FF(完全不透明),除了角落像素是60(62% 透明)。

    要解压IDAT 块(和其他一些压缩块),这需要实现deflate 算法(官方规范中有相关链接)。

    报告的 CRC 存在于文件中(我注意到这个实用程序实际上并没有验证它们,我需要一段时间来添加它)。

    如果你想使用原始 PNG文件作为你的输入,你需要(a)能够找到、阅读和理解官方规范,(b)很好地掌握计算机成像术语,如灰度、索引、调色板、伽玛、隔行扫描、过滤、Alpha 和 RGB,(c) 理解 deflate 足以将现有实现集成到您自己的源代码中(这就是我所做的,而不是去加倍努力并编写从头开始),以及 (d) 将所有这些信息组合成一个抽象模型,该模型适合将数据转换为您的输出格式。 p>

    或者您可以跳过所有这些并使用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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-26
      • 1970-01-01
      • 2020-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多