ScriptIntrinsicBlur生成黑色位图

时间:2014-03-03 10:58:21

标签: android renderscript

我正在尝试使用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上运行应用程序。

2 个答案:

答案 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的问题。