gpt4 book ai didi

Android:如何找到不会导致应用崩溃的位图范围?

转载 作者:行者123 更新时间:2023-12-03 16:54:44 29 4
gpt4 key购买 nike

在尝试从网络流中解码位图时,我偶尔会导致应用程序崩溃,以防位图范围超过允许的内存大小。

为了克服这个问题,我使用了这里解释的策略:

http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

由于我使用宽度和高度为 500x500 的谨慎方法作为 calculateInSampleSize 的输入,因此我不再遇到内存问题,但客户提示缩小图像的图像质量差。

因为我似乎没有明显的方法来确定不会崩溃的位图范围,所以不幸的是,我不得不尝试使用相当低的值(此处为 500x500),而在具体情况下 1000x1000 也可以正常工作。

有什么方法可以找出作为 calculateInSampleSize 输入的位图范围是最大范围,这不会在后续调用中使应用程序崩溃,例如解码字节数组?

问候

最佳答案

好的,我找到了方法。我喜欢在这里分享,也许有一些优点和缺点。

1)首先(这与我的原始代码没有改变)我正在确定位图的原始范围,它在函数的 byte[] 中可用:

    BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length, options);

/* Here we have the original dimensions of the bitmap */
int iH = options.outHeight;
int iW = options.outWidth;
String iT = options.outMimeType;

2)然后我试图找到最好的缩放值,最终会产生一个不大于 2048x2048 的位图,因为这似乎是 OpenGL 的限制(至少痕迹告诉我类似的东西)
    int rh = iH;
int rw = iW;
int sz = 1;

while (true) {
rh = Math.round((float)iH/(float)(sz));
rw = Math.round((float)iW/(float)(sz));
if (rh <= 2048 && rw <= 2048)
break;
sz++;
}

3)最后我正在创建新的(可能是缩小的图像)并尝试在这里捕获可能的内存溢出错误。然后我可以用一个增加的正增量重新迭代到 sz,但我决定只返回 null。
    options.inJustDecodeBounds = false;
options.inSampleSize = sz;
Bitmap bm = null;
try {
bm = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length, options);
}
catch (OutOfMemoryError e) {
}
return bm;

这对我来说很好。

关于Android:如何找到不会导致应用崩溃的位图范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15422559/

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