0

我是 android 新手,正在开发我的第一个真正的应用程序,所以如果这个问题已得到解答或不够详细,我深表歉意。将位图加载到我的 android 应用程序时,我遇到了常见的 OutOfMemoryError。我在 stackoverflow 上进行了搜索,并浏览了描述如何使用 InSampleSize 减少每个位图的内存的谷歌教程。

在测试应用程序以查看通过缩小位图节省了多少内存时,我注意到堆大小仍在以相同的速度增长。IE 当我使用 InSampleSize = 8 而根本不缩放位图(或 InSampleSize = 1)时,每个堆的增长都相同。

我已经尝试使用 myImage.getByteCount() 打印上面列出的两个缩放 SampleSizes 的 byteCount,并且它们都具有相同的 ByteCounts。这是预期的行为吗?由于我正在缩小图像,不应该减少字节数吗?我期待看到用于位图的内存减少了 8 倍左右。我错过了什么,还是我对图像缩放的理解不正确?谢谢。

编辑:在做了一些测试后,我发现如果我使用 createScaledBitmap 内存会减少,但它需要我首先膨胀原始位图然后缩放。我假设这是不理想的,因为它需要。我认为第一种方法会为我做到这一点,但根据我的堆转储它不是。

初始代码和堆转储:

private static Bitmap decodeSampledBitmap(Resources res, int resId, int width, int height
{
  // First decode with inJustDecodeBounds=true to check dimensions
  final BitmapFactory.Options options = new BitmapFactory.Options();
  options.inJustDecodeBounds = true;
  options.inPreferredConfig = Config.ARGB_8888;
  BitmapFactory.decodeResource(res, resId, options);

  // Calculate inSampleSize
  options.inSampleSize = calculateInSampleSize(options, width, height);

  // Decode bitmap with inSampleSize set
  options.inJustDecodeBounds = false;
  return BitmapFactory.decodeResource(res, resId, options);
}

更新代码(与上面相同,唯一的区别是)和堆转储:

private static Bitmap decodeSampledBitmap(Resource res, int ResId, int width, int height)
{
  ....
  Bitmap bitmap = BitmapFactory.decodeResource(res, resId, options);
  return Bitmap.createScaledBitmap(bitmap, options.outWidth/options.inSampleSize, options.outHeight/options.inSampleSize, false);
}

由于我的声誉,它不会让我发布图像,但根据堆转储它正在使用 79.155MB。使用第二种技术,堆转储使用 26.912 MB。

4

1 回答 1

0

您是否在使用解码后缩放位图InSampleSize

于 2013-11-08T05:39:25.107 回答