我是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。
答案 0 :(得分:0)
使用InSampleSize
对其进行解码后,是否缩放了位图?