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

标签 android bitmap crash

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

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

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/

相关文章:

android - FirebaseUser getMetadata 返回 null

android - 任何适用于 Android 的 MergeCursor 示例?

java - 将 OpenSL 添加到安卓

android - android ffmpeg 库是否能够播放位于 assets 文件夹中的视频

crash - Xcode 6.3-NSOperationQueue存档崩溃

c# - 高效处理超宽但不是那么高的位图?

java - 为什么 Bitmap.createBitmap() 返回与源位图不同的可变位图?

bitmap - 将旋转位图与拼贴图像匹配

ios - 呈现 View Controller 时发生崩溃

mysql - 表 './mysql/proc' 被标记为崩溃,应该修复