0

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

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

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

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

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

有没有办法找出作为calculateInSampleSize 输入的位图范围是最大范围,这不会在后续调用例如decodeByteArray 时使应用程序崩溃?

问候

4

1 回答 1

1

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

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;

这对我来说很好。

于 2013-03-15T09:37:04.420 回答