如何使用Renderscript将大图像模糊为小图像



背景

假设我有一个相当大的位图,我想把它模糊成一个较小的位图。

我之所以这么问,是因为在一些罕见的设备上,Renderscript本身出现了奇怪的崩溃,所以可能是输入的问题(事实上,我已经确定它很小(:

java.lang.OutOfMemoryError: Failed to allocate a 1920169996 byte allocation with 16777216 free bytes and 67MB until OOM
   at android.renderscript.RenderScript$MessageThread.run(RenderScript.java:1111)

这很奇怪,因为输入位图不可能这么大(几乎2GB?!(。

问题

下面的代码试图做到这一点,但由于某种原因,输出位图只将大位图的左上角区域带入自身:

        outputBitmap = Bitmap.createBitmap(srcBitmap.getWidth(), srcBitmap.getHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(outputBitmap);
        canvas.drawBitmap(srcBitmap, 0, 0, null);
        Allocation overlayAlloc = Allocation.createFromBitmap(rs, outputBitmap, MipmapControl.MIPMAP_NONE, Allocation.USAGE_GRAPHICS_TEXTURE);
        ScriptIntrinsicBlur blur = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
        blur.setInput(overlayAlloc);
        blur.setRadius(radius);
        blur.forEach(overlayAlloc);
        overlayAlloc.copyTo(outputBitmap);
        rs.destroy();
        return outputBitmap;

问题

这怎么可能呢?应该做些什么来修复它?显然,我可以创建一个新的位图作为输入,并使其大小与小位图相同,但这会创建另一个占用内存的位图,我希望避免它

在尝试在不创建小位图的情况下节省内存之前,请检查以下内容:http://trickyandroid.com/advanced-blurring-techniques/

如果你缩小你的图像,模糊它,然后再放大,你可以节省时间——棘手的模糊和公平的模糊之间没有太大区别,但它节省了时间。

PS。您也可以查看本主题中的renderscript示例。PSS。你也可以检查这个关于模糊的线程:Android SDK 的快速位图模糊

最新更新