RenderScript不会修改Alpha通道? [Android]产品

时间:2016-04-29 13:12:36

标签: android android-bitmap renderscript android-renderscript

我正在使用RenderScript中的简单脚本。我必须从Bitmap修改像素上的RGBA值。经过多次尝试,我发现Alpha通道没有被修改。

我做了一些研究,我发现了this old question,但我不明白这是怎么发生的。是否有正确的方法来修改脚本上的Alpha通道?

这是我的代码的简化版本:

Java方面:

Allocation img= Allocation.createFromBitmap(encodeRS, bmp,Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_SCRIPT);

RenderScript方面:

uchar4 __attribute__((kernel)) root(uchar4 in, uint32_t x, uint32_t y) {

    uchar r= (in.r) & 0xFC;
    uchar g= (in.g) & 0xFC;
    uchar b= (in.b) & 0xFC;
    uchar a= (in.a) & 0xFC;

    return (uchar4) {r,g,b,a};

}

我也试过了内存绑定,但结果是一样的:

void root(uchar4* in, uint32_t x, uint32_t y) {

    uchar r= (in->r) & 0xFC;
    uchar g= (in->g) & 0xFC;
    uchar b= (in->b) & 0xFC;
    uchar a= (in->a) & 0xFC;

    in->r= r;
    in->g= g;
    in->b= b;
    in->a= a;

}

然后我从java端(在forEach之后)执行copyTo,但alpha通道自动设置为255

img.copyTo(bmp);

非常感谢您的支持。

- 更新1:

我忘了提到我使用getAbsolutePath()从文件中获取Bitmap:

Bitmap bmp= BitmapFactory.decodeFile(imgFile.getAbsolutePath());

1 个答案:

答案 0 :(得分:2)

不知道你的输入Bitmap bmp最初是如何定义的,但是为了确保输出Bitmap具有可编辑的Alpha通道,我将明确定义为:

 Bitmap outBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
 Allocation img= Allocation.createFromBitmap(rs, outBitmap, Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_SCRIPT);

然后,最后:

img.copyTo(outBitmap);