RenderScript Intrinsics 高斯模糊

Posted

技术标签:

【中文标题】RenderScript Intrinsics 高斯模糊【英文标题】:RenderScript Intrinsics Gaussian blur 【发布时间】:2013-09-01 10:02:12 【问题描述】:

如何正确使用 RenderScript Intrinsics。

如图http://android-developers.blogspot.com/2013/08/renderscript-intrinsics.html

//Assuming my original Bitmap is "bm"
Bitmap outputBitmap = Bitmap.createBitmap(bm.getHeight(),
bm.getWidth(), Config.ARGB_8888);

RenderScript rs = RenderScript.create(getApplicationContext());
ScriptIntrinsicBlur theIntrinsic = ScriptIntrinsicBlur
.create(rs, Element.U8_4(rs));
Allocation tmpIn = Allocation.createFromBitmap(rs, bm);
Allocation tmpOut = Allocation.createFromBitmap(rs, outputBitmap);
theIntrinsic.setRadius(25.f);
theIntrinsic.setInput(tmpIn);
theIntrinsic.forEach(tmpOut);
tmpOut.copyTo(outputBitmap);
bm.recycle();
rs.destroy

我在初始布局中得到了 outputBitmap 的一些黑色区域,但在用户滚动 Horizo​​ntalScrollView 的 Scroller 后会填充这些区域,从而使可绘制对象“刷新”本身。

我也遇到了这个错误(如果有帮助的话):

09-01 05:54:11.246: E/RenderScript(11423): rsAssert failed: !mElements.size(), in frameworks/rs/rsElement.cpp at 375

任何有关正确使用 RS 的建议都会有所帮助。

【问题讨论】:

【参考方案1】:

我认为问题在于您切换了 heightwidth 参数的顺序。应该是:

Bitmap outputBitmap = Bitmap.createBitmap(bm.getWidth(), bm.getHeight(), Config.ARGB_8888);

【讨论】:

【参考方案2】:

我猜你的 UI 部分而不是 RS 部分有问题。 RS零件看起来不错;也许在 RS 位完成后尝试 outputBitmap.prepareToDraw()?

请注意,一般而言,像这样在关键路径中创建和销毁 RS 上下文并不是一个好主意。根据必须分配的硬件资源,可能存在不小的启动/拆卸成本,因此最好在启动时分配它并在应用程序的整个生命周期内使用它。

【讨论】:

以上是关于RenderScript Intrinsics 高斯模糊的主要内容,如果未能解决你的问题,请参考以下文章

Chain 2 Renderscript Intrinsics:模糊和色彩矩阵

Android RenderScriptRenderScript 简介 ② ( RenderScript 引入 | RenderScript 简介 )

Android RenderScriptRenderScript 简介 ③ ( RenderScript 发布和运行 | RenderScript 脚本 )

RenderScript多输入参数

使用 Renderscript 启动选项裁剪图像数据

RenderScript在Android 6上崩溃