android - 了解 ImageProcessing 代码

标签 android c++ c image-processing android-ndk

我是android ndk的新手。我已经开始通过
的图像处理示例学习 ruckusby 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/

相关文章:

java - 编译 Android 应用程序时第 3 方库依赖项上的 NoClassDefFoundError

android - Android 支持 Maven 存储库中缺少 DrawerLayout

c++ - std::this_thread::yield 只是一个提示会不会有问题?

c - 指向指针的指针

android - 创建一个游标指向一个数组

c++ - SIGSEGV;丢失文件;使用 sscanf 运行程序时

c++ - 使用 avcodec_decode_subtitle2 (FFmpeg) 提取(解复用)字幕

c - 函数语法中的声明

c - float (或 double )到十进制定点整数

java - Android 媒体播放器返回 NullPointerException