Renderscript Greyscale不太合适

时间:2015-08-09 14:36:29

标签: renderscript

这是我现在的renderscript代码:

#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;
    }

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

我想知道我的renderscript代码是否错误。我应该将char转换为其他类型吗?

2 个答案:

答案 0 :(得分:2)

使用临时变量在计算结果时保存结果。否则,在第一行中您修改pixel.r,在下一行中,您正在使用它来计算pixel.g。难怪你得到了文物。

另外,不要忘记分配alpha值以避免意外发现"隐形"输出

答案 1 :(得分:0)

另外我建议不要对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;
}