如何使用Renderscript将大图像模糊成较小的图像?

时间:2015-07-29 09:39:06

标签: android bitmap blur 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;

问题

怎么会这样?应该怎么做来解决它? 显然,我可以创建一个新的位图作为输入,并使其与小的位图相同,但这会创建另一个占用内存的位图,我想避免它。

1 个答案:

答案 0 :(得分:0)

在尝试保存内存而不创建小位图之前,请尝试检查: http://trickyandroid.com/advanced-blurring-techniques/

如果你缩小图像尺寸,模糊它然后升级,你可以节省时间 - 技巧模糊和公平模糊之间没有太大的区别,但它可以节省时间。

PS。您也可以查看此主题的renderscript示例。 PSS。你也可以查看这个关于模糊的帖子: Fast Bitmap Blur For Android SDK