【问题标题】:How to use Renderscript to blur a large image into a smaller one?如何使用 Renderscript 将大图像模糊为较小的图像?
【发布时间】:2015-10-20 05:03:35
【问题描述】:

背景

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

我之所以问这个问题,是因为我在一些稀有设备上的 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;

问题

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

【问题讨论】:

    标签: android bitmap blur renderscript


    【解决方案1】:

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

    如果您将图像缩小、模糊然后放大,您可以节省时间 - 棘手模糊和一般模糊之间没有太大区别,但可以节省时间。

    PS。你也可以从这个主题检查 renderscript 示例。 PSS。你也可以检查这个关于模糊的线程: Fast Bitmap Blur For Android SDK

    【讨论】:

    • 我已经缩小了(正如我所写,输入图像没有那么大),缩小到 250dp。问题是,我不知道它是如何崩溃的。这就是为什么我试图找到解决方案。很奇怪,这么多设备都可以正常工作,但有些设备的 OOM 崩溃了将近 2GB...
    • 据我了解,您已经发布了您试图避免此崩溃的修复程序,并且在图像的左上侧遇到问题?您能否发布导致此崩溃的代码?
    • 代码已经写好了。这就是这里的奇怪之处......我想看看我是否能以某种方式让它变得更好。也许我应该问它怎么会发生,但人们会问我为什么不下采样,但我已经这样做了......
    • 我只看到初始大小为 srcBitmap 的代码。您是如何尝试缩小图像的? stackoverflow.com/a/16408737/527808
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多