【问题标题】:How to convert a PNG to 1-bit BMP如何将 PNG 转换为 1 位 BMP
【发布时间】: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


【解决方案1】:

事实上,Imagemagick 确实支持 1 位 BMP,如果使用 BMP3 或 BMP2 格式,但不支持 BMP4,它只是 BMP。因此,如果您希望每个通道具有 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

【讨论】:

    【解决方案2】:

    我不确定这会回答哪个问题,但来自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
    

    【讨论】:

      【解决方案3】:

      在 Fedora 27 上,该命令是:

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

      你需要:

      $  dnf install netpbm-progs
      

      【讨论】:

      • 您的答案是关于 Fedora。作者在 MacOSX 上。您应该删除您的回复。
      猜你喜欢
      • 1970-01-01
      • 2013-10-04
      • 2017-09-27
      • 1970-01-01
      • 1970-01-01
      • 2012-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多