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

Android位图大小减少而不减少内存,android,bitmap,Android,Bitmap,我是android新手,正在开发我的第一个真正的应用程序,所以如果这个问题已经得到回答,或者不够详细,我深表歉意。将位图加载到android应用程序时,我遇到了常见的OutOfMemory错误。我在stackoverflow上搜索了一下,浏览了google,它描述了如何使用InSampleSize来减少每个位图的内存 当测试应用程序以查看通过缩小位图节省了多少内存时,我注意到堆大小仍在以相同的速度增长。也就是说,当我使用InSampleSize=8而不是完全不缩放位图(或InSampleSize

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

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

我已尝试使用以下方法打印字节数: myImage.getByteCount() 对于上面列出的两个缩放示例,它们都具有相同的字节数。这是预期的行为吗?既然我正在缩小图像的尺寸,字节数不应该减少吗? 我希望看到位图使用的内存减少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);
}
更新的代码(同上,唯一的区别是)和堆转储:

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。

在使用采样解码位图后,您是否缩放位图?

我不这么认为。我的印象是,在我用:BitmapFactory.decodeResource(res、resId、options)创建位图之后;使用选项中的InSampleSize缩放位图。是否需要通过以下方式缩放位图:Bitmap.createdScaledBitmap(Bitmap,options.OutHeight/options.InSampleSize,options.OutWidth/options.InSampleSize,false);不需要,但您应该尝试给出
options.inScaled=false
options.inPreferredConfig=Bitmap.Config.ARGB_8888。这帮助我解决了我的问题。谢谢,我将测试它并让您知道。查看堆转储后,我发现使用bitmap.createScaledBitmap(bitmap,options.OutHeight/options.InSampleSize,options.OutWidth/options.InSampleSize,false)缩放位图;