繁体   English   中英

如何将PNG转换为1位BMP

[英]How to convert a PNG to 1-bit 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 00s位于0x132-0x134而不是一开始?

谢谢

实际上,如果使用BMP3或BMP2格式,Imagemagick确实支持1位BMP,但不支持仅BMP4的BMP4。 因此,如果您希望每个通道1位深度,请执行

输入:

在此处输入图片说明

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

在此处输入图片说明

如果您希望整个图像的深度为1位(即二进制),请执行

convert image.png -depth 1 -type bilevel BMP3:result2.bmp

在此处输入图片说明

要么

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

在此处输入图片说明

我不确定会回答哪个问题,但是来自用法文档

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

因此,如果我们利用NetPBM

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

给出的结果(注意值是0和1,但是您仍然有RGB通道)

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

在Fedora 27上,该命令是:

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

你需要:

$  dnf install netpbm-progs

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM