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

3

背景

假设我有一个相当大的位图,我想将其模糊为一个较小的位图。

我之所以提出这个问题,是因为在一些罕见的设备上,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

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

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

附:您还可以从此主题中检查renderscript示例。 PSS. 您还可以检查有关模糊的此线程: Fast Bitmap Blur For Android SDK


我已经将图片缩小了(正如我所写的,输入的图片并不是很大),缩小到了250dp。问题是,我不知道为什么会出现这种崩溃。这就是为什么我试图寻找解决方案。非常奇怪的是,有很多设备可以正常工作,但有些设备会出现OOM崩溃,甚至达到2GB... - android developer
据我所了解,您已经发布了尝试修复此崩溃的解决方案,并且在图像左上侧遇到了问题?您可以发布产生此崩溃的代码吗? - dilix
代码已经写好了。这就是奇怪的地方...我想知道是否可以以某种方式使它变得更好。也许我应该问为什么会发生这种情况,但人们会问为什么我不降采样,而我已经这样做了... - android developer
我只看到了初始大小为srcBitmap的代码。你尝试过如何缩小图像吗?https://dev59.com/t2Qn5IYBdhLWcg3w_LTx#16408737 - dilix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接