我是android ndk的新手。我已经开始通过
的图像处理示例学习
ruckus和 by IBM blog .我没有得到下面几行。任何人都可以帮助我理解代码 fragment 吗?`
static void brightness(AndroidBitmapInfo* info, void* pixels, float brightnessValue){
int xx, yy, red, green, blue;
uint32_t* line;
for(yy = 0; yy < info->height; yy++){
line = (uint32_t*)pixels;
for(xx =0; xx < info->width; xx++){
//extract the RGB values from the pixel
red = (int) ((line[xx] & 0x00FF0000) >> 16);
green = (int)((line[xx] & 0x0000FF00) >> 8);
blue = (int) (line[xx] & 0x00000FF );
//manipulate each value
red = rgb_clamp((int)(red * brightnessValue));
green = rgb_clamp((int)(green * brightnessValue));
blue = rgb_clamp((int)(blue * brightnessValue));
// set the new pixel back in
line[xx] =
((red << 16) & 0x00FF0000) |
((green << 8) & 0x0000FF00) |
(blue & 0x000000FF);
}
pixels = (char*)pixels + info->stride;
}
}
`
static int rgb_clamp(int value) {
if(value > 255) {
return 255;
}
if(value < 0) {
return 0;
}
return value;
}
如何提取 RGB 值以及此 rgb_clamp 的作用。为什么我们要设置新的 Pixell 以及 pixels = (char*)pixels + info->stride;作品? 我不是 c/c++ 的人,对图像处理的了解不多。 谢谢
最佳答案
首先让我们谈谈一个像素。据我所知,它至少由 3 个 channel 组成:r、g 和 b,它们都存储在一个 uint32_t
值中,格式为 0x00RRGGBB(32bit/4 channels = 8bit每个 channel ,因此值范围为 0..255)。因此,要获得分离的 r、g 和 b 值,您需要将它们屏蔽掉,这是在 //extract the RGB values
下面的三行中完成的。例如红色组件...使用掩码 0x00FF0000 和 &
运算符,您将每个位设置为 0,除了在红色 channel 中设置的位。但是当你用 0x00RRGGBB & 0x00FF0000 = 0x00RR0000
屏蔽它们时,你会得到一个非常大的数字。要获得 0 到 255 之间的值,您还必须将位向右移动,这就是 >>>
运算符所做的。所以对于后一个例子:应用掩码后,你得到 0x00RR0000,将这 16 位右移 (>> 16
) 给你 0x000000RR
,这是一个介于 0 之间的数字和 255。绿色 channel 也是如此,但右移了 8 位,并且由于蓝色值已经位于“右”位位置,因此无需移位。
第二个问题:rgb_clamp
的作用很容易解释。它确保您的 r、g 或 b 值乘以您的亮度系数,永远不会超过值范围 0..255。
在与亮度因子相乘后,新值被写回内存,这与上述提取的顺序相反,这次将它们向左移动并删除我们不想要的掩码位.
处理完图像的一行后,添加了 info->stride
,因为出于优化目的,内存可能对齐以填充 32 字节边界,因此单行可能比只有图像宽度和因此“其余”字节被添加到指针。
关于android - 了解 ImageProcessing 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12933065/