好的,我找到了方法。我喜欢在这里分享,也许有一些优点和缺点。
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;
这对我来说很好。