我正在尝试使用RenderScript框架模糊应用程序中的位图。我正在使用以下代码:
public static Bitmap apply(Context context, Bitmap sentBitmap, int radius)
{
Bitmap bitmap = sentBitmap.copy(sentBitmap.getConfig(), true);
final RenderScript rs = RenderScript.create(context);
final Allocation input = Allocation.createFromBitmap(rs, sentBitmap,
Allocation.MipmapControl.MIPMAP_NONE,
Allocation.USAGE_SCRIPT);
final Allocation output = Allocation.createTyped(rs, input.getType());
final ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
script.setRadius(radius);
script.setInput(input);
script.forEach(output);
output.copyTo(bitmap);
return bitmap;
}
不幸的是,我用代码得到的只是黑色位图。如何解决此问题?
传递给 apply
方法的位图按以下方式创建:
Bitmap b = Bitmap.createBitmap(thisView.getWidth(),
thisView.getHeight(),
Bitmap.Config.ARGB_8888);
这些位图的宽度和高度是 4 的倍数。
RenderScript 也报告了一些错误,但我不知道它们是什么意思以及我应该如何修复它们(ScriptIntrinsicBlur
的文档相当薄)。以下是这些错误:
20305-20391/com.xxx E/RenderScript﹕ rsi_ScriptIntrinsicCreate 5
20305-20391/com.xxx E/RenderScript﹕ rsAssert failed: mUserRefCount > 0, in
frameworks/rs/rsObjectBase.cpp at 112
编辑:
半径为5,我正在使用Android 4.2.1在三星Galaxy Nexus上运行该应用程序。
使用此函数模糊输入位图图像:
Bitmap BlurImage(Bitmap input) {
RenderScript rsScript = RenderScript.create(this);
Allocation alloc = Allocation.createFromBitmap(rsScript, input);
ScriptIntrinsicBlur blur = ScriptIntrinsicBlur.create(rsScript, alloc.getElement());
blur.setRadius(12);
blur.setInput(alloc);
Bitmap result = Bitmap.createBitmap(input.getWidth(), input.getHeight(), input.getConfig());
Allocation outAlloc = Allocation.createFromBitmap(rsScript, result);
blur.forEach(outAlloc);
outAlloc.copyTo(result);
rsScript.destroy();
return result;
}
感谢@Tim Murray,我解决了这个问题(实际上有两个)
我改用支持库,现在我希望带有 gradle 项目的 Android Studio 最终能够学会处理库符号。
问题的另一个主要来源是我使用完全透明的位图作为ScriptIntrinsicBlur
的输入。我的坏。
从三月-07-2013编辑
Android Studio 0.5 修复了 Gradle 驱动的项目中支持 RenderScript 的问题。