1

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

我做了一些研究,发现了这个老问题,但我不明白这是如何发生的以及为什么会发生。是否有正确的方法来修改脚本上的 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 bmp= BitmapFactory.decodeFile(imgFile.getAbsolutePath());
4

1 回答 1

2

不知道,您的输入位图 bmp 最初是如何定义的,但为了确保输出位图具有可编辑的 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);
于 2016-04-29T21:27:25.700 回答