RenderScript内在函数高斯模糊

时间:2013-09-01 10:02:13

标签: android intrinsics renderscript

如何正确使用RenderScript内在函数。

如图所示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之后会填充它,使得drawable“刷新”本身。

我也得到了这个错误(如果它有帮助):

09-01 05:54:11.246: E/RenderScript(11423): rsAssert failed: !mElements.size(), in frameworks/rs/rsElement.cpp at 375
关于正确使用RS的任何建议都会有所帮助。

enter image description here

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:3)

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

请注意,一般来说,在关键路径中创建和销毁RS上下文并不是一个好主意。根据必须分配的硬件资源,可能会有非常重要的启动/拆卸成本,因此在启动时分配它并在应用程序的生命周期内使用它会好得多。