繁体   English   中英

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

[英]How to use Renderscript to blur a large image into a smaller one?

背景

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

我实际上问这个是因为我在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的快速位图模糊

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM