Android位图大小减少不会减少内存

时间:2013-11-07 19:42:31

标签: android bitmap

我是Android的新手,正在开发我的第一个真正的应用程序,所以如果这个问题得到解答,或者不够详细,我道歉。将bitmaps加载到我的Android应用程序时,我遇到了常见的OutOfMemoryError。我已经搜索了stackoverflow并浏览了一下google tutorial,它描述了如何使用InSampleSize来减少每个位图的内存。

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

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

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

初始代码和堆转储:

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。

1 个答案:

答案 0 :(得分:0)

使用InSampleSize对其进行解码后,是否缩放了位图?