【问题标题】:RGB color in 24 bitmap image and 16 bitmap image24 位图图像和 16 位图图像中的 RGB 颜色
【发布时间】:2018-04-01 13:20:56
【问题描述】:

1) 我想知道 24 位图图像中红色的值。

像素由 24 位表示,其中红色、绿色和蓝色 (RGB) 值各有 8 位

假设我打开 24 位图图像,并将数据保存在 unsigned char Array A 中。

i,e) ( A[0],A[1],A[2] ) 是 24 位图图像的第一个像素值。

那么红色的值是多少?

我认为 24​​ 位图图像颜色顺序(?)是 'RGB',所以 A[0] 是红色值。我说的对吗?

2) 在 16 位图图像中,像素由 16 位表示,其中红色、绿色和蓝色 (RGB) 值各有 5 位。

假设我打开 16 位图图像,并将数据保存在 unsigned short Array B 中。

i,e) B[0] 是 16 位图图像的第一个像素值。

在这种情况下,我想知道红色的值。

我认为最后 5 位,即 'A[0] & 31' 是蓝色的值,因为 16 位图图像的颜色顺序(?)是 'RGB'

我说的对吗?

【问题讨论】:

  • 你为什么在猜测而不是使用库?
  • 蓝色是最不重要的位,红色是最重要的位。机器的endian-ness起了作用,如果图像是在big-endian机器上生成的,可能性越来越小,那么改用BGR就方便了。所以 A[0] 通常是蓝色的,对于 16bpp,你必须使用 0x1f。请注意,565 对于 16bpp 来说并不少见。明智的做法是忽略所有这些并仅使用 32bpp,通过使用 int* 寻址像素,字节顺序细节会消失。

标签: c++ image colors bitmap


【解决方案1】:

位图很难在源代码中使用来检索其数据。您首先必须解析文件以获取其标题,并且您必须从其标题解析它及其数据以了解您正在使用的位图图像类型。位图存储了大量信息。从逻辑上讲,如果位图图像是 24 位而没有专门针对 RGB 类型的透明度值,那么您需要知道图像是否被压缩以及通过什么压缩方法以及文件的其他属性,例如调色板信息、图标信息等。所以你知道在哪里可以找到该特定文件中的实际像素数据。提取原始数据后,您需要知道信息是如何存储的。这可能会变得棘手:它可能是 RGB 图像,但数据可以直接 RGB 顺序存储在文件中,也可以反转 BGR。之后,就需要知道图像数据的存储方向以及是否需要垂直、水平或同时翻转它。除此之外,如果颜色数据的顺序正确并且图像的方向正确且没有压缩,那么毫无疑问,对于 unsigned char 值,它的结构应该是这样的:

位图 24 位 - RGB 的 24/3 表示每个通道 8 位或每个通道 1 字节。 由于 unsigned char 的内存宽度为 1 个字节,因此 适当的顺序将代表每个颜色通道。考虑以下几点:


// Considering data is in RGB order:
unsigned char colorData[3];      // Integer Base Range
colorData[0] = red byte          [0, 255]
colorData[1] = green byte        [0, 255]
colorData[2] = blue byte         [0, 255]

至于位图内部文件结构,这里是解析其数据的好来源:bmp

【讨论】:

    猜你喜欢
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    • 2014-11-03
    • 2015-08-04
    • 2015-05-02
    • 2020-06-30
    相关资源
    最近更新 更多