这是我现在的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
转换为其他类型吗?
答案 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;
}