[英]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.