我是 Renderscript 的新手,在我的第一个脚本中遇到了一些问题。据我所知(从我插入的调试语句中)我的代码工作正常,但是当计算值被 Allocation.copyTo(Bitmap) 方法复制回 Bitmap 时,它们被破坏了。
我得到了奇怪的颜色,所以最终将我的脚本剥离到这个显示问题的示例:
void root(const uchar4 *v_in, uchar4 *v_out, const void *usrData, uint32_t x, uint32_t y)
{
*v_out = rsPackColorTo8888(1.f, 0.f, 0.f, 1.f);
if (x==0 && y==0) {
rsDebug("v_out ", v_out->x, v_out->y, v_out->z, v_out->w);
}
}
这里我们只是写出一个不透明的红色像素。调试行似乎打印了正确的值 (255 0 0 255),实际上我在位图中得到了一个红色像素。
但是,如果我稍微更改红色像素上的 alpha:
*v_out = rsPackColorTo8888(1.f, 0.f, 0.f, 0.998f);
调试打印 (255 0 0 254) 看起来仍然正确,但最终像素值最终为 (0 0 0 254) 即。黑色。
显然我怀疑这是一个预乘 alpha 问题,但我的理解是从位图复制和复制到位图的分配例程应该会为您处理这个问题。至少这就是 Chet Haase 在这篇博文中的建议:https://plus.google.com/u/0/+ChetHaase/posts/ef6Deey6xKA .
此外,似乎没有一个示例计算脚本提到预乘 alpha 的任何问题。我的脚本基于 SDK 中的 HelloComputer 示例。
如果我犯了错误,我希望 RS 专家为我指出错误。
遗憾的是,经过 2 年多的时间,Renderscript 的文档仍然很差。
附言。我使用的位图是 ARGB_888,我正在 SDK18 (Android 4.3) 上构建和定位
最佳答案
该示例运行良好,因为该示例未修改 alpha。
如果您要修改 alpha 然后将 Allocation 用作普通位图,您应该返回 (r*a, g*a, b*a, a)。
但是,如果您将分配发送到未预乘的 GL 表面,您的代码将按原样工作。
关于android - Allocation.copyTo(Bitmap) 破坏像素值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18079898/