【发布时间】:2016-09-16 16:57:47
【问题描述】:
所以,我试图了解 PNG 到 BMP 的转换实际上是如何发生的。我使用在线工具创建了以下 8x8 像素的 PNG:
然后我在 OSX 终端中使用 ImageMagik 工具进行了转换:
$ convert -monochrome pic.png pic.bmp
之后,我对图像进行了 hexdump:
$ hexdump -C pic.bmp
00000000 42 4d 4a 01 00 00 00 00 00 00 8a 00 00 00 7c 00 |BMJ...........|.|
00000010 00 00 08 00 00 00 08 00 00 00 01 00 18 00 00 00 |................|
00000020 00 00 c0 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000030 00 00 00 00 00 00 00 00 ff 00 00 ff 00 00 ff 00 |................|
00000040 00 00 00 00 00 ff 42 47 52 73 8f c2 f5 28 51 b8 |......BGRs...(Q.|
00000050 1e 15 1e 85 eb 01 33 33 33 13 66 66 66 26 66 66 |......333.fff&ff|
00000060 66 06 99 99 99 09 3d 0a d7 03 28 5c 8f 32 00 00 |f.....=...(\.2..|
00000070 00 00 00 00 00 00 00 00 00 00 04 00 00 00 00 00 |................|
00000080 00 00 00 00 00 00 00 00 00 00 ff ff ff ff ff ff |................|
00000090 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
*
00000130 ff ff 00 00 00 ff ff ff ff ff ff ff ff ff ff ff |................|
00000140 ff ff ff ff ff ff ff ff ff ff |..........|
0000014a
所以,显然我们有一个从 0x00 到 0x8C 的 BMP 标头。然后我们有白色像素的 FF 和黑色的 00。这一切都说得通,但输出的结构却没有。到目前为止,似乎有一个 3 比 1 的比例。每个像素 3 个字节。我假设这意味着黑色,白色,无色?
我需要完全理解为什么每个像素有 3 个字节而不是 2 个字节。理想情况下,我希望每个像素使用二进制 1 或 0。有没有办法做到这一点?如果没有,有人可以解释一下字节的布局吗?具体来说:为什么3个00在0x132 - 0x134而不是最开始?
谢谢
【问题讨论】:
-
可能是一个彩色 bmp,意思是 24bits-per-color (8bit red, 8bit green, 8bit blue)。如果你想要一个真正的黑白位图,你必须输出适当的 bmp 标头选项来说明它是黑白的。
-
BMP 文件格式在其维基百科页面上有很好的解释。为什么不从那里开始?一方面,它告诉您该标头中的哪个字节指示位深度。
标签: image imagemagick png bmp