android - Allocation.copyTo(Bitmap) 破坏像素值

标签 android renderscript

我是 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/

相关文章:

android - 库项目中的 Renderscript 将导致 findViewById() 返回 null

java - Android RenderScript 信号 7 (SIGBUS),代码 1 (BUS_ADRALN),故障地址 0x76f458b4 Adreno 306、320

android - ScriptIntrinsicBlur 生成不适当的模糊

android - 以编程方式设置 Android 所有者密码

Android:如何以编程方式检查 TextView 是粗体还是斜体

java - 如何仅在特定时间调用函数

java - Android RenderScript FinalizerWatchdogDaemon 致命异常

android - 如何获取 styles.xml 文件的资源标识符?

android - 使用定时器重复 IntentService - 是否可取?

java - Android 上使用 RenderScript 的中值滤波器