gpt4 book ai didi

Android BitmapFactory.decodeFile 变慢直到内存不足

转载 作者:行者123 更新时间:2023-11-29 21:06:33 25 4
gpt4 key购买 nike

我正在处理多达 1200 张图像。在此处找到的先前问题的帮助下,我将其优化为可以处理 100 张图像到 500 张图像。现在,这就是我所拥有的:

   public Bitmap getBitmap(String filepath) {
boolean done = false;
int downsampleBy = 2;
Bitmap bitmap = null;
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(filepath, options);

// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
options.inPreferredConfig = Config.RGB_565;
while (!done) {
options.inSampleSize = downsampleBy++;
try {
bitmap = BitmapFactory.decodeFile(filepath, options);
done = true;
} catch (OutOfMemoryError e) {
// Ignore. Try again.
}
}
return bitmap;
}

这个函数在循环中被调用,它运行得非常快,直到它到达第 500 个图像。此时它会减慢速度,直到它最终在第 600 张图像处停止工作。

在这一点上,我不知道如何优化它以使其工作。您认为发生了什么,我该如何解决?

编辑

            // Decode BItmap considering memory limitations
public Bitmap getBitmap(String filepath) {
Bitmap bitmap = null;
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(filepath, options);

// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
options.inPreferredConfig = Config.RGB_565;
options.inDither = true;
options.inSampleSize= calculateInSampleSize(options, 160, 120);

return bitmap = BitmapFactory.decodeFile(filepath, options);
}

public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;

if (height > reqHeight || width > reqWidth) {

final int halfHeight = height / 2;
final int halfWidth = width / 2;

// Calculate the largest inSampleSize value that is a power of 2 and keeps both
// height and width larger than the requested height and width.
while ((halfHeight / inSampleSize) > reqHeight
&& (halfWidth / inSampleSize) > reqWidth) {
inSampleSize *= 2;
}
}

return inSampleSize;
}

对已接受的答案进行了更改。使用 Google 教程中的函数来获得正确的样本量。在 list 中添加了 largeHeap,并且在循环遍历所有图像之前只调用 System.gc() 一次。

最佳答案

首先,您永远不应该期望捕获错误。此处描述:Java documentation Error 是 Throwable 的子类,表示合理的应用程序不应 try catch 的严重问题。

关于加载位图有一些帮助:Android Developers | Loading large bitmaps

您可以通过在应用程序 list 中声明 largeHeap="true" 属性来获得更多内存。

System.gc() 调用可能有助于释放一些未使用的内存,但我不会真正依赖该调用。

关于Android BitmapFactory.decodeFile 变慢直到内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24355306/

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