我有以下代码来创建大小为8303×5540的画布,但运行该代码会生成OutOfMemoryException
。
scaledBitmap = Bitmap.createBitmap(8303, 5540, Bitmap.Config.ARGB_8888);
如何解决此问题?
答案 0 :(得分:5)
在android:largeHeap="true"
中设置AndroidManifest.xml
帮助了我。
答案 1 :(得分:4)
嗯..创建这个大小的位图,你必须分配大约183MB的内存。这对大多数手机来说都是一个问题。您可以尝试在清单中设置android:largeHeap =“true”,但仍然无法在大多数手机上为您提供足够的内存。
如果您愿意接受图像的“二次采样”版本,并且图像数据来自文件,您可以查看http://developer.android.com/training/displaying-bitmaps/load-bitmap.html以将大图像的子样本加载到内存中。基本上,您可以告诉BitmapFactory加载每个X像素中的一个,从而避免要求在内存中包含所有183MB的图像数据。
答案 2 :(得分:-1)
http://codingaffairs.blogspot.com/2016/07/processing-bitmap-and-memory-management.html
现在,这里有一些提示,您可以遵循这些提示,并避免Android应用程序中的内存不足。
现在什么是inSampleSize? 在inSampleSize的帮助下,你实际上是在告诉解码器不要抓住内存中的每个像素,而是取样子图像。 这将导致在内存中加载的像素数量少于原始图像。您可以告诉解码器从原始图像中抓取每第4个像素或每秒像素。 如果inSampleSize为4.解码器将返回一张图像,该图像是原始图像中像素数的1/16。
那么你节省了多少记忆?计算:)
在加载到内存之前读取位图尺寸。
如何在将图像加载到内存之前读取位图尺寸可以帮助您避免出现问题 内存错误?让我们学习
使用inJustBounds = true
这里的技术可以帮助您将图像尺寸加载到内存中
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.id.myimage, options);
int imageHeight = options.outHeight;
int imageWidth = options.outWidth;
String imageType = options.outMimeType;
上面的代码段不会给我们任何图片/位图。它将为位图Object返回null。 但它肯定会返回该图像的宽度和高度。这是R.id.myimage。
现在你有了Image的宽度和高度。您可以根据以下因素放大或缩小图像:
屏幕尺寸和设备密度。
位图配置是图像的颜色空间/颜色深度。 Android中的默认位图配置为RGB_8888,即每像素4个字节。
如果使用RGB_565颜色通道,每个像素使用2个字节。相同分辨率的内存分配的一半:)
使用inBitmap属性进行回收。
不要制作静态Drawable Object,因为它不能被垃圾收集。
在清单文件中请求大堆。
如果您正在进行大量图像处理(内存密集型任务)或使用NDK(使用c,c ++进行本机开发),请使用多个进程