我是 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。