如何将PNG转换为1位BMP

时间:2016-05-19 16:52:12

标签: image imagemagick png bmp

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

enter image description here

然后我使用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 00s在0x132 - 0x134而不是最开始?

由于

3 个答案:

答案 0 :(得分:2)

事实上,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

答案 1 :(得分:1)

我不确定这会回答哪个问题,但是来自Usage docs

  

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

因此,如果我们利用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

答案 2 :(得分:-1)

在Fedora 27上,该命令是:

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

你需要:

$  dnf install netpbm-progs
相关问题