【发布时间】: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