从没有任何库的像素值获取RGB通道

时间:2013-05-19 18:10:33

标签: c++ image-processing rgb

从没有任何库的像素值获取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是我前面提到的“像素”变量。
感谢。

2 个答案:

答案 0 :(得分:1)

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

int r = color & 0xff;
int g = (color >> 8) & 0xff;
int b = (color >> 16) & 0xff;
int a = (color >> 24) & 0xff;

答案 1 :(得分: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

由于它看起来有点复杂,我强烈建议使用一个库而不是自己编辑。