如何将PNG转换为1位BMP?

3

我正在尝试理解PNG转BMP的转换过程。 我使用在线工具创建了以下8x8像素的PNG图像:

enter image description here

然后我在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。有没有办法做到这一点?如果没有,能否有人解释一下字节的布局?具体地说:为什么在0x132 - 0x134处有3个00而不是一开始?
谢谢。

可能是一个彩色BMP,意味着每个颜色有24位(8位红色、8位绿色、8位蓝色)。如果你想要真正的黑白位图,就必须输出相应的BMP头选项来表明它是黑白的。 - Marc B
BMP文件格式在其维基百科页面上有详细说明。为什么不从那里开始呢?首先,它告诉你标头中的哪个字节指示位深度。 - Jongware
3个回答

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

enter image description here

convert image.png -depth 1 BMP3:result.bmp

enter image description here

如果您希望整个图像的深度为1位(即二进制),则执行以下操作:
convert image.png -depth 1 -type bilevel BMP3:result2.bmp

enter image description here

或者

convert image.png -depth 1 -threshold 50% BMP3:result3.bmp

enter image description here


2
我不确定这篇文章将回答哪个问题,但从使用文档中可以看到:

IM无法生成深度级别为8以外的BMP。 但是,您可以使用NetPBM图像处理集来进行最终转换到其他深度级别(这需要至少一个Q16版本的IM)...

因此,如果我们利用NetPBM

$ convert pic.png -depth 1  ppm:- | hexdump

这意味着你有RGB通道(请注意,值为0和1)。

0000000 50 36 0a 38 20 38 0a 31 0a 00 00 00 01 01 01 01
0000010 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
*
00000c0 01 01 01 01 01 01 01 01 01                     
00000c9

因此,一个解决方案可能就是这么简单:
$ convert pic.png -depth 1  ppm:- | pnmdepth 1 | ppm2bmp > pic.bmp

0
在Fedora 27上,该命令是:

$ convert pic.png -depth 1  ppm:- | pnmdepth 1 | ppmtobmp > pic.bmp

你需要:

$  dnf install netpbm-progs

1
你的回答与 Fedora 相关。作者使用的是 MacOSX。你应该删除你的回复。 - Boris Le Méec

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接