1

在没有任何库的情况下从像素值获取 RGB 通道
我正在尝试获取从图像中读取的每个像素的 RGB 通道。我通过从图像中读取每个字节来使用 getchar。所以在我在网上做了一些搜索后,我发现了 BMP 例如颜色数据在 36 字节之后开始,我知道每个通道是 8 位,整个 RGB 是 8 位红色,8 位绿色和8 点蓝色。我的问题是如何从像素值中提取它们?
例如:

pixel = getchar(image);

我该怎么做才能提取这些频道?此外,我在 JAVA 上看到了这个示例,但不知道如何在 C++ 上实现它:

int rgb[] = new int[] {
(argb >> 16) & 0xff, //red
(argb >>  8) & 0xff, //green
(argb      ) & 0xff  //blue
};

我猜想 argb 是我之前提到的“像素”变量。
谢谢。

4

2 回答 2

1

假设它被编码为 ABGR 并且每个像素有一个整数值,这应该可以解决问题:

int r = color & 0xff;
int g = (color >> 8) & 0xff;
int b = (color >> 16) & 0xff;
int a = (color >> 24) & 0xff;
于 2013-05-26T22:37:15.590 回答
0

读取单个字节时,它取决于格式的字节顺序。由于有两种可能的方式,这当然总是不一致的,所以我将两种方式都写,读取作为伪函数完成:

RGBA:

int r = readByte();
int g = readByte();
int b = readByte();
int a = readByte();

ABGR:

int a = readByte();
int b = readByte();
int g = readByte();
int r = readByte();

它的编码方式取决于您的文件格式的布局方式。我还看到了 BGRA 和 ARGB 顺序以及平面 RGB(每个通道都是宽度 x 高度字节的单独缓冲区)。

看起来维基百科对 BMP 文件的外观有很好的概述: http ://en.wikipedia.org/wiki/BMP_file_format

由于它似乎有点复杂,我强烈建议为此使用库而不是自己滚动。

于 2013-05-26T22:49:07.537 回答