如何将 PNG 转换为 1 位 BMP

Joh*_*arr 3 png image imagemagick bmp

所以,我试图了解 PNG 到 BMP 转换实际上是如何发生的。我使用在线工具创建了以下 8x8 像素 PNG:

在此输入图像描述

然后我在 OSX 终端中使用 ImageMagik 工具执行转换:

$ convert -monochrome pic.png pic.bmp

之后,我对图像进行了十六进制转储:

$ 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,而不是最开始?

谢谢

fmw*_*w42 5

事实上,如果使用 BMP3 或 BMP2 格式,Imagemagick 确实支持 1 位 BMP,但不支持 BMP4,BMP4 只是 BMP。因此,如果您想要每个通道 1 位深度,那么请执行以下操作

输入:

在此输入图像描述

convert image.png -depth 1 BMP3:result.bmp
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

如果您想要整个图像(即二进制)的 1 位深度,则执行

convert image.png -depth 1 -type bilevel BMP3:result2.bmp
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

或者

convert image.png -depth 1 -threshold 50% BMP3:result3.bmp
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述