SDL Library提取红色通道

时间:2013-09-03 13:15:43

标签: c++ image-processing sdl

是否有任何特定的功能可以生成图像的红色通道与原始图像进行比较?

1 个答案:

答案 0 :(得分:2)

您可以使用surface->pixels和带有surface->format->Rmask的图片Rmask访问像素数据。查看按位运算以提取数据

SDL_Surface* t;
//Code
Uint32* pixels = (Uint32*)t->pixels;
int x = 10 ,y = 10;  //For pixel at 10, 10
Uint32* MyPixel = pixels + ( (y-1) + t->w ) + x;

Uint32 RedOnly = *MyPixel & t->format->Rmask;

注意:犯了一个愚蠢的错误,忘了y应该是y-1。

Uint32* MyPixel = pixels + ( (y-1) + t->w ) + x的工作原理如下:

pixels是一个指针,指向Uint32数据数组中的第一个元素。 (32位int)。如果我做像素+ 1,那就说看看Uint32大小的内存字节。如果我想在2D坐标系中使用像素10,10,我们需要将其转换为一维线性值。 SDL_Surface像素是水平和线性的,所以它是:

1,2,3,4,5
6,7,8,9,10

所以((y-1) * t->w) + x将获得lineaer形式的像素的整数值。对于2,2的像素,例如在上面的情况下,宽度为5,变为((2-1)*5)+2),即7。然后我们取像素并将其偏移7(pixels+7),这是来自数组原点的Uint32(7 * 32位)7个int的地址。

Uint32 RedOnly = *MyPixel & t->format->Rmask的工作原理如下: 让我假设您的像素(0xFF41A401)有一些随机的Uint32,假设图片格式是ARGB。这意味着你的Rmask是0x00FF0000 在二进制文件中

*MyPixel = 1111 1111 0100 0001 1010 0100 0000 0001
Rmask    = 0000 0000 1111 1111 0000 0000 0000 0000

//And a bitwise & operation will result in:

RedOnly  = 0000 0000 0100 0001 0000 0000 0000 0000

因此,只剩下红色值,因此您“删除”所有蓝色/绿色信息。