背景
假设我有一个相当大的位图,我想将其模糊为一个较小的位图。
我之所以提出这个问题,是因为在一些罕见的设备上,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;
问题
为什么会出现这种情况?应该如何解决? 显然,我可以创建一个新的位图作为输入,并使其与小位图大小相同,但这会创建另一个占用内存的位图,我想避免这种情况。