簡體   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