Android 设置缩略图,injustdecodebounds

来源:互联网 发布:单片机0xff是什么意思 编辑:程序博客网 时间:2024/04/29 20:02

我们去解析一个图片,如果太大,就会OOM,我们可以设置压缩比例inSampleSize,但是这个压缩比例设置多少就是个问题,所以我们解析图片可以分为俩个步骤,第一步就是

获取图片的宽高,这里要设置Options.inJustDecodeBounds=true,这时候decode的bitmap为null,只是把图片的宽高放在Options里,然后第二步就是设置合适的压缩比例inSampleSize,这时候获得合适的Bitmap.这里我画了简单的流程图,如下:

这里写图片描述

主要是通过BitmapFactory.Options 来实现。

Options中有个属性inJustDecodeBounds。我们可以充分利用它,来避免大图片的溢出问题。他是什么原理呢?

API这样说:如果该 值设为true那么将不返回实际的bitmap,也不给其分配内存空间这样就避免内存溢出了。但是允许我们查询图片的信息这其中就包括图片大小信息(

options.outHeight (图片原始高度)和option.outWidth(图片原始宽度))。

Options中有个属性inSampleSize。我们可以充分利用它,实现缩放。

如果被设置为一个值> 1,要求解码器解码出原始图像的一个子样本,返回一个较小的bitmap,以节省存储空间。

例如,inSampleSize = = 2,则取出的缩略图的宽和高都是原始图片的1/2,图片大小就为原始大小的1/4。

对于任何值< = 1的同样处置为1。

那么相应的方法也就出来了,通过设置 inJustDecodeBounds为true,获取到outHeight(图片原始高度)和 outWidth(图片的原始宽度),然后计算一个inSampleSize(缩放值),

然后就可以取图片了,这里要注意的是,inSampleSize 可能小于0,必须做判断。

实现步骤:

第一步:BitmapFactory.Option

设置 inJustDecodeBounds为true

第二步:BitmapFactory.decodeFile(path,option)方法

解码图片路径为一个位图。如果指定的文件名是空的,或者不能解码到一个位图,函数将返回null[空值]。

获取到outHeight(图片原始高度)和 outWidth(图片的原始宽度)

第三步:计算缩放比例,也可以不计算,直接给它设定一个值。

options.inSampleSize = “你的缩放倍数”;

如果是2就是高度和宽度都是原始的一半。

第四步:设置options.inJustDecodeBounds = false;

重新读出图片

bitmap = BitmapFactory.decodeFile(path, options);

具体代码:

//        设置图片视频的缩略图        imgiv.setImageBitmap(getImageThumbnail(url, 200, 200));        videoiv.setImageBitmap(getVideoThumbnail(urlvideo, 200, 200,
//        获取图片缩略图    public Bitmap getImageThumbnail(String uri, int width, int height) {        Bitmap bitmap = null;        BitmapFactory.Options options = new BitmapFactory.Options();        options.inJustDecodeBounds = true;        bitmap = BitmapFactory.decodeFile(uri, options);        options.inJustDecodeBounds = false;//        计算缩放比例        int beWidth = options.outWidth / width;        int beHeight = options.outHeight / height;        int be = 1;        if (beWidth < beHeight) {            be = beWidth;        } else {            be = beHeight;        }        if (be <= 0) {            be = 1;        }        options.inSampleSize = be;//        将缩放后的图片赋给bitmap对象并返回        bitmap = BitmapFactory.decodeFile(uri, options);        bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height,                ThumbnailUtils.OPTIONS_RECYCLE_INPUT);        return bitmap;    }//    获取视频缩略图    private Bitmap getVideoThumbnail(String uri, int width, int height, int kind) {        Bitmap bitmap = null;        bitmap = ThumbnailUtils.createVideoThumbnail(uri, kind);        bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height,                ThumbnailUtils.OPTIONS_RECYCLE_INPUT);        return bitmap;    }
0 0
原创粉丝点击