我正在尝试使用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在Samsung Galaxy Nexus上运行应用程序。
答案 0 :(得分:0)
使用此功能模糊输入的位图图像:
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;
}
答案 1 :(得分:0)
感谢@Tim Murray,我解决了这个问题(实际上有两个)
我转而使用支持库,现在我希望带有gradle项目的Android Studio最终能学会处理库符号。
另一个主要问题来源是我使用完全透明的位图作为ScriptIntrinsicBlur
的输入。我的坏。
2013年3月7日编辑
Android Studio 0.5修复了Gradle驱动项目中支持RenderScript的问题。