获取图片信息

简介: 引用:http://my.eoe.cn/blue_rain/archive/240.html 当图片过大,或图片数量较多时使用BitmapFactory解码图片会出java.lang.OutOfMemoryError: bitmap size exceeds VM budget,要想正常使用则需分配更少的内存,具体的解决办法是修改采样值BitmapFactory.

引用:http://my.eoe.cn/blue_rain/archive/240.html

当图片过大,或图片数量较多时使用BitmapFactory解码图片会出java.lang.OutOfMemoryError: bitmap size exceeds VM budget,要想正常使用则需分配更少的内存,具体的解决办法是修改采样值BitmapFactory.Options.inSampleSize,例如:

1
2
3
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inSampleSize = 4;
Bitmap bitmap = BitmapFactory.decodeFile(imageFile, opts);

如何设置恰当的inSampleSize

设置恰当的inSampleSize是解决该问题的关键之一。BitmapFactory.Options提供了另一个成员inJustDecodeBounds。

1
2
3
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inJustDecodeBounds = true;
Bitmap bitmap = BitmapFactory.decodeFile(imageFile, opts);

设置inJustDecodeBounds为true后,decodeFile并不分配空间,但可计算出原始图片的长度和宽度,即opts.width和opts.height。有了这两个参数,再通过一定的算法,即可得到一个恰当的inSampleSize。

查看Android源码,Android提供了一种动态计算的方法。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public static int computeSampleSize(BitmapFactory.Options options,
        int minSideLength, int maxNumOfPixels) {
    int initialSize = computeInitialSampleSize(options, minSideLength,maxNumOfPixels);

    int roundedSize;
    if (initialSize <= 8 ) {
        roundedSize = 1;
        while (roundedSize < initialSize) {
            roundedSize <<= 1;
        }
    } else {
        roundedSize = (initialSize + 7) / 8 * 8;
    }

    return roundedSize;
}

private static int computeInitialSampleSize(BitmapFactory.Options options,int minSideLength, int maxNumOfPixels) {
    double w = options.outWidth;
    double h = options.outHeight;

    int lowerBound = (maxNumOfPixels == -1) ? 1 :
            (int) Math.ceil(Math.sqrt(w * h / maxNumOfPixels));
    int upperBound = (minSideLength == -1) ? 128 :
            (int) Math.min(Math.floor(w / minSideLength),
            Math.floor(h / minSideLength));

    if (upperBound < lowerBound) {
        // return the larger one when there is no overlapping zone.
        return lowerBound;
    }

    if ((maxNumOfPixels == -1) &&
            (minSideLength == -1)) {
        return 1;
    } else if (minSideLength == -1) {
        return lowerBound;
    } else {
        return upperBound;
    }
}

使用该算法,就可动态计算出图片的inSampleSize。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inJustDecodeBounds = true;
BitmapFactory.decodeFile(imageFile, opts);

opts.inSampleSize = computeSampleSize(opts, -1, 128*128);
opts.inJustDecodeBounds = false;
try {
    Bitmap bmp = BitmapFactory.decodeFile(imageFile, opts);
    imageView.setImageBitmap(bmp);
    } catch (OutOfMemoryError err) {
}

此办法只是获取的图片的缩略图,可能会造成失真!

相关文章
|
7月前
批量获取图片(中)
批量获取图片(中)
81 0
|
7月前
批量获取图片(下)
批量获取图片(下)
72 0
|
存储 编解码 Java
图片Exif信息解析(Java实现)
图片Exif信息解析(Java实现)
|
5月前
根据图片获取图片中最多的颜色
根据图片获取图片中最多的颜色
|
7月前
|
存储
获取图片上传【file】
获取图片上传【file】
46 1
|
7月前
|
iOS开发 MacOS Python
批量获取图片(上)
批量获取图片(上)
56 0
|
存储 编解码 Java
轻松获取图片和视频文件的Exif信息-Java篇
本文简单介绍了Metadata 元数据以及Exif可交换图像文件信息的基本知识,介绍了metadata-extractor的具体用法,展示了png图像元数据读取、GPS坐标识别和定位以及视频的元数据信息提取,而metadata-extractor提供了大量能使我们快速便捷地获取元数据的方法。
5220 0
|
算法 定位技术 API
推荐一个小项目:上传图片获取图片的经纬度以及拍摄时间
推荐一个小项目:上传图片获取图片的经纬度以及拍摄时间
254 0
|
存储 编解码 前端开发
input上传图片并同步获取图片分辨率
🎈作为一名前端开发,页面交互少不了图片上传,但有时候我们需要对上传图片做一些限制,如尺寸要求和像素分辨率要求,所以这里我们一起来看看前端上传图片如何获取图片的分辨率。
421 0
|
前端开发 JavaScript 定位技术
前端获取图片exif信息
对又是我,每天都有新的需求。 这次的需求是上传图片的时获取图片的宽高、设备、光圈等信息。 不用考虑服务端做,他们肯定是不做。 pc、android、ios 都支持了,现在就缺少 web 这边上传的图片了。 上测试地址:https://www.lilnong.top/static/html/exif.html
239 0
前端获取图片exif信息