我正在使用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());
答案 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);