0

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

4

1 回答 1

2

您可以使用 访问像素数据,使用 访问surface->pixels图片 Rmask surface->format->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像这样工作:

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

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

因此((y-1) * t->w) + x将以线性形式获得像素的整数值。对于 2,2 处的像素,例如在上述情况下,宽度为 5,则((2-1)*5)+2)变为7. 然后我们获取像素并将其偏移 7 ( pixels+7),这是 Uint32(7*32 位)从数组原点开始的 7 个整数的地址。

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

因此,仅保留红色值,因此您“擦除”所有蓝色/绿色信息。

于 2013-09-03T13:45:11.250 回答