在安卓中从内存创建位图

3
我有以下代码来创建一个大小为8303×5540的画布,但运行该代码会产生一个OutOfMemoryException异常。
scaledBitmap = Bitmap.createBitmap(8303, 5540, Bitmap.Config.ARGB_8888);

我该如何解决这个问题?

1
这是因为应用程序没有足够的可用内存来创建该位图。您需要将其缩小。 - stealthjong
1
我正在创建一个空白画布。 - user3748230
2
不要紧,每个像素都被分配了一个地图。每个像素都是一个int(4字节),所以这就是8303 x 5540 x 4 =约1.84亿(这就是Baske得到他183MB的地方)。 - stealthjong
请阅读这篇博客文章:http://codingaffairs.blogspot.com/2016/07/processing-bitmap-and-memory-management.html - Developine
3个回答

5

AndroidManifest.xml中设置android:largeHeap="true"对我很有帮助。


4

创建这样大小的位图,您需要分配约183MB的内存。这对大多数手机来说都是个问题。您可以尝试在清单中设置android:largeHeap="true",但在大多数手机上,这仍然无法给您足够的内存。

如果您愿意接受图像的“子采样”版本,并且图像数据来自文件,则可以查看http://developer.android.com/training/displaying-bitmaps/load-bitmap.html以将大图像的子采样加载到内存中。基本上,您可以告诉BitmapFactory每X像素加载一次,从而避免了需要将所有183MB的图像数据放入内存的要求。


-2

http://codingaffairs.blogspot.com/2016/07/processing-bitmap-and-memory-management.html

现在这里有一些提示,可以帮助您避免在Android应用程序中出现内存不足异常。

  1. 始终使用inSampleSize

那么什么是inSampleSize? 通过inSampleSize,您实际上告诉解码器不要在内存中抓取每个像素,而是对图像进行子采样。 这将导致加载到内存中的像素数量比原始图像少。您可以告诉解码器从原始图像中抓取每4个像素或每2个像素。 如果inSampleSize为4,则解码器将返回一个大小为原始图像像素数的1/16的图像。

那么您节省了多少内存?自己算吧 :)

  1. 在将位图加载到内存之前读取位图尺寸。

    在将位图尺寸读入内存之前如何帮助您避免内存不足错误?让我们学习一下

    使用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;

上述代码片段将不会返回任何图像/位图,它将对位图对象返回null。 但是它肯定会返回那张图像的宽度和高度。它的ID是R.id.myimage。
现在您有了图像的宽度和高度。您可以根据以下因素缩放图像:
  • 用于显示图像的ImageView大小。
  • 可用内存量。您可以使用ActivityManager和getMemoryClass来检查可用内存量。
  • 设备的屏幕大小和密度。

    1. 使用适当的位图配置

    位图配置是图像的色彩空间/色深。Android中默认的位图配置为RGB_8888,即每个像素4字节。

如果您使用2字节每像素的RGB_565颜色通道,则相同分辨率的内存分配减半:)

  1. 使用inBitmap属性进行回收。

  2. 不要创建静态Drawable对象,因为它无法被垃圾回收。

  3. 在清单文件中请求大堆内存。

  4. 如果您正在进行大量图像处理(内存密集型任务),请使用多个进程或使用NDK(使用c、c++的本地开发)。


为什么要踩?如果你遵循所有这些步骤,就可以避免由于大位图而导致的内存泄漏。 - Developine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接