【问题标题】:What is the BMP format for Gray scale Images?灰度图像的 BMP 格式是什么?
【发布时间】:2012-06-20 15:31:58
【问题描述】:

灰度图像的 BMP 格式是什么(尤其是每像素 16 位)? wikipedia 只是谈论 bmp 的彩色图像。

更新:

只是为了将来的访问者的更新和信息,我会选择PGM,因为它是未压缩的并且可以支持 16 位灰度。另一种选择是使用PNG,但它会压缩数据(这不是我想要的),正如here 所讨论的那样。 另请注意,图像可能会出现失真,因为大多数显示器支持 256 色而不是 16 位的 4096。所以图像会饱和。

令人惊讶的是,BMP 在 16 位图像的灰度情况下几乎无能为力。
感谢帮助我理解问题的人。

【问题讨论】:

  • 如果你想要 16 位灰度,你需要使用不同的格式——我建议使用 PNG。
  • 是无损压缩吗?
  • 是的,PNG 是无损的 - 它使用 zlib 进行压缩:en.wikipedia.org/wiki/Portable_Network_Graphics
  • 这个帖子已经有 7 年历史了,但是 PNG 压缩是无损的并且使用 zlib。 zlib 可以指定为使用压缩级别 0,这意味着根本没有压缩。所以你可能有非压缩的 PNG。
  • 请注意,完整的 16 位是 65536 色,而不是 4096。也许您正在考虑 12 位?

标签: image bitmap file-format


【解决方案1】:

对于灰度图像,我会使用 8 位 BMP。 8 位 BMP 可以使用调色板对颜色进行编码。但是,如果您不使用一个,您可以简单地将颜色值 [0...255] 解释为从黑色 (0) 到白色 (255) 的颜色。

编辑:我不会将 BMP 用于 16 位灰度图像。从技术上讲,您可以使用每像素 16 位 BMP 格式来编码 16 位灰度数据 (http://en.wikipedia.org/wiki/BMP_file_format#Pixel_format)。然而在实践中,这是一个坏主意(阅读:hacky),因为该深度旨在对像素的 alpha、红色、绿色和蓝色样本进行编码。

存储每像素 16 位灰度数据的更好格式是 PNG。

同时问问自己,你真的、真的需要这种额外的精度吗?对于大多数应用程序,每像素 8 位就可以了(=如果您对精度没有任何特定要求,那就是这种情况)。

【讨论】:

  • 这并不能真正帮助他处理 16 位灰度图像。
  • 完全同意您的 BMP 评估,因为它不仅需要自定义文件编写器,还需要自定义文件阅读器。标准 BMP 阅读器会将他试图完成的灰度解释为其他颜色,并且输出将(至少可以说)有趣。 +1
【解决方案2】:

你说得对,BMP 只知道颜色。这样做的方法是创建一个包含 256 个条目的调色板,其中每个条目具有相同的 R、G、B 值:第一个条目 (0,0,0),第二个条目 (1,1,1) 等。现在使用调色板使图像每像素 8 位。

编辑:鉴于您对 16 位灰度的新要求,我认为您有 2 个选择:转换为 8 位,或使用 BMP 以外的其他格式。如果您转换为 8 位,您可以使用抖动来生成与源 16 位图像在视觉上无法区分的结果。

【讨论】:

  • @trumpetlicks,这个问题在写的时候没有提到 16 位。
  • 抱歉,没有注意到这是一个更新 :-) 除此之外,很好的答案!
【解决方案3】:

看起来,TIFF 和 PNG 本身就支持 16 位灰度。

http://en.wikipedia.org/wiki/Grayscale

我假设您希望保存的这些图像不仅仅是为了显示,而是为了某种需要额外精度的后期处理?如果不是,那么我建议删除最低有效 8 位,并使用颜色图存储一个更简单的 8 位位图,以将每个值映射到具有 value -> (value, value, value) RGB 映射的 RGB。

【讨论】:

    【解决方案4】:

    什么是灰度图像的 BMP 格式

    除了使用调色板之外,您还可以通过使用BITMAPV4HEADER 编写 BMP 来创建灰度 BMP(每像素 8 位)。并将bV4RedMaskbV4GreenMaskbV4BlueMask 设置为相同的值。但是,这种格式的最小bcBitCount 值为 16,因此每个像素仍需要占用两个字节。不过,您可以将第二个字节用于 Alpha 通道(透明度)。

    尤其是每像素 16 位

    看起来没有任何 BMP 版本支持 16 位色深。尽管文件格式看似允许(bcBitCount=16bV4…Mask=0xFFFF),但图像编辑器和库会丢弃多余的位。

    Some documents 指的是 64-BPP BMP 文件,但不清楚这如何与 BITMAPV4HEADER 字段匹配,因为掩码字段的大小都是 32 位(因此无法为 64 位指定通道掩码BPP)。

    另一种选择是使用 PNG,但它会压缩数据(这不是我想要的),如此处所述。

    如果您不想压缩 PNG 文件,则不必压缩。使用 0 的压缩级别将使像素保持原样(加上一个 zlib 页眉/页脚)。

    另外请注意,图像可能会出现失真,因为大多数显示器支持 256 色,而不是 16 位的 4096。

    16 位深度将允许 65536 个不同的每通道亮度值,而不是 4096。失真听起来像是伽马曲线的问题,并且与文件格式问题没有真正的关系。

    【讨论】:

      猜你喜欢
      • 2020-03-21
      • 2013-09-15
      • 2015-10-28
      • 2014-04-25
      • 2021-08-13
      • 2019-12-03
      • 1970-01-01
      • 2020-02-10
      • 1970-01-01
      相关资源
      最近更新 更多