尝试了解PNG格式。
考虑一下这张PNG图像:
图片来自here
在十六进制编辑器中,它看起来像这样:
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和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
同样地,这是:在HEX编辑器中可以看到的%PNG
有效的PNG图像必须包含IHDR块,一个或多个IDAT块以及IEND块。
2-大块:长度
00 00 00 0D
3-Chunk:Chunk Type
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-块:BIT DEPTH(1个字节)
08
7-块:颜色类型
02
8-压缩方法
00
9-过滤方式:
00
10-隔行扫描方法:
00
11-以下数据是什么?
C6 25 AA 3E 00 00 00 C2
12-- IDAT
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 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
14- IEND:
49 45 4E 44
15-最后4个字节
AE 42 60 82
这些是什么?
有些人可以帮助我理解,上面第11,13和15点? Pixel值在哪里?图像具有(128 x 68像素)
了解这些细节的目的:
一旦我知道这些细节,我将生成自己的16位PNG图像。我已经有了像素值,所以我的工作就是引入标题等 我不知道是否有可以执行此工作的软件。
更新
我现在明白因为压缩,我无法找到像素值。
我知道我可以在OpenCV中编写一个文件并将其另存为png。那么现在我的直接问题是:我有一个二进制文件,具有灰度16位像素值。我可以在OpenCV中将其写为16位PNG吗?
答案 0 :(得分:3)
虽然了解PNG图像的实际内容以及图像在文件中的实际表现方式可能会很有趣,但您无需知道这一点就可以生成PNG文件。
请注意,PNG使用无损压缩,这意味着每个像素不会获得两个字节。
您可以在程序中生成图像,并使用许多库中的库以PNG格式输出图像。
例如,您可以在OpenCV中创建图像,然后使用imWrite
输出它。其中一个参数可以将其输出到PNG。
如果您有灰度16位像素值,则可以将它们放入Mat
。
然后将其转换为IplImage:Converting cv::Mat to IplImage*
然后您可以将其输出到文件中。
答案 1 :(得分:3)
为了完整性(eboix的回答是正确的)
11-以下数据是什么?
C6 25 AA 3E 00 00 00 C2
每个块以CRC(4个字节)结束,以4个字节开头,表示其长度。
因此,C6 25 AA 3E
是前一个块(IHDR)的CRC,00 00 00 C2
(194)是以下(IDAT)块的长度。
同样,最后4个字节是IEND块的CRC。
答案 2 :(得分:3)
我看起来不太仔细,但从结构上看......
Q11。 C6 25 AA 3E = CRC32 00 00 00 C2 =下一个块的大小
Q13。 检查你之前提到的那个看起来像你已经知道应用压缩的IDAT块的png规范!
Q15。 AE 42 60 82 = CRC32