【问题标题】:Allocation.copyTo(Bitmap) corrupting pixel valuesAllocation.copyTo(Bitmap) 破坏像素值
【发布时间】:2013-08-06 12:15:26
【问题描述】:

我是 Renderscript 的新手,我的第一个脚本遇到了一些问题。据我所知(从我插入的调试语句中)我的代码工作正常,但是当通过 Allocation.copyTo(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) 上构建和定位

【问题讨论】:

  • 如果你只修改 rgb 值而不是 alpha 怎么样?
  • 问题在于改变 alpha。我可能没有说清楚。只要 alpha 转换为 255 一切都很好。如果是其他任何东西,像素就会被破坏。
  • 由于其他示例对其他人来说显然工作正常,我想知道这是 Android 4.3 问题还是 ADT 20.0.5。
  • 您是如何创建分配的? createFromBitmap?使用标志是什么?
  • Allocation.createFromBitmap(mRS, bm) 用于 mIn 和 Allocation.createTyped(mRS, mIn.getType()) 用于 mOut

标签: android renderscript


【解决方案1】:

该示例运行良好,因为该示例没有修改 alpha。

如果要修改 alpha,然后将分配用作普通位图,则应返回 (r*a, g*a, b*a, a)。

但是,如果您将分配发送到未预乘的 GL 表面,您的代码将按原样运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    • 2023-03-25
    • 2017-08-30
    相关资源
    最近更新 更多