gpt4 book ai didi

java - 这个位图的inSampleSize计算方法有什么问题?内存不足

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:00:54 26 4
gpt4 key购买 nike

在我的应用程序中,我遍历图像的 URL,解码并将它们放入 ArrayList<Bitmap> 中.

它们的大小可能相差很大,因此我正在使用 inJustDecodeBounds = true 进行“预解码”选项来计算必要的 inSampleSize实际解码的值。

在下面查看我的方法,我希望它不会太难理解。基本上,我的目标是与设备的屏幕尺寸相似。

for (Element e: posts) {
if (!e.id().equals("")) {
//preparing decode
options = new BitmapFactory.Options();
input = new URL(e.url).openStream();
options.inJustDecodeBounds = true;
BitmapFactory.decodeStream(input, null, options);
input.close();

//setting inSampleSize if necessary
int picPixels = options.outWidth * options.outHeight;
int picScreenRatio = picPixels / screenPixels;
if (picScreenRatio > 1) {
int sampleSize = picScreenRatio % 2 == 0 ? picScreenRatio : picScreenRatio + 1;
options.inSampleSize = sampleSize;
}

//actual decode
input = new URL(e.url).openStream();
options.inJustDecodeBounds = false;
Bitmap pic = BitmapFactory.decodeStream(input, null, options);
input.close();

picList.add(pic);
}
}

计算screenPixels的代码:

Display display = getWindowManager().getDefaultDisplay();
Point screenSize = new Point();
display.getSize(screenSize);
int screenPixels = screenSize.x * screenSize.y;

我正在查看约 60 张图片,其中大约 40 张我的应用程序因 java.lang.OutOfMemoryError 而崩溃.

据我了解,使用 inJustDecodeBounds = true没有分配内存,如果我的方法是正确的(我相信是的),非常大的图像会变得非常大 inSampleSize s,所以我不知道可能是什么问题。

如有任何建议,我们将不胜感激。

最佳答案

无论您使用 inSampleSize,您都无法轻松地在内存中容纳与屏幕一样大的 60 个位图。

假设全高清屏幕你得到大约 1920*1080*60*4 字节。

这大约是 500 MB 的数据。您需要以某种方式更改您的位图加载逻辑。

this回答你可以找出你可以计算多少内存。它因各种设备而异。

但请始终尝试让您的应用尽可能地提高内存效率。

关于java - 这个位图的inSampleSize计算方法有什么问题?内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30192265/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com