Renderscript 灰度效果不佳

Renderscript Greyscale not quite working

这是我现在的渲染脚本代码:

#pragma version(1)
#pragma rs java_package_name(com.apps.foo.bar)

rs_allocation inPixels;

    uchar4 RS_KERNEL root(uchar4 in, uint32_t x, uint32_t y) {

      uchar4 pixel = in.rgba;

      pixel.r = (pixel.r + pixel.g + pixel.b)/3;
      pixel.g = (pixel.r + pixel.g + pixel.b)/3;
      pixel.b = (pixel.r + pixel.g + pixel.b)/3;

      return pixel;
    }

我的 phone 显示了 "greyscaled" 图片。我说 "grayscaled" 因为例如红色,仍然有点红……它是灰色的,但你仍然可以看到它是红色的。我知道我可以使用更复杂的方法,但我现在想坚持使用简单的方法。

我想知道我的 renderscript 代码是否有误。我应该将 char 转换为另一种类型吗?

使用临时变量保存计算结果。否则,在第一行中您要修改 pixel.r,而在下一行中您将使用它来计算 pixel.g。难怪你会得到神器。

此外,不要忘记分配 alpha 值以避免 "invisible" 输出出现意外。

此外,我建议不要对 r、g 和 b 使用相同的权重,而是使用如下权重。参见例如http://www.johndcook.com/blog/2009/08/24/algorithms-convert-color-grayscale/

char4 __attribute__((kernel)) gray(uchar4 in) {
uchar4 out;
float gr= 0.2125*in.r + 0.7154*in.g + 0.0721*in.b;
   out.r = out.g = out.b = gr;
   out.a = in.a;
return out;
}