针对大图转Bitmap的压缩处理

public  Bitmap setBitmapFromDisk(){
        BitmapFactory.Options options=new BitmapFactory.Options();
        //设置只加载图片的格式尺寸信息到内存,不加载具体的图片字节。
        options.inJustDecodeBounds=true;
        Bitmap bitmap=BitmapFactory.*decodeResource* 
                      (getResources(),R.drawable.*big*,options);
        //获取图片的高度和宽度
        int  height=options.outHeight;
        int  width=options.outWidth;
        //获取图片的类型
        String imageType = options.outMimeType;
        Log.*d*("imageTest",height+"    "+width+"   "+imageType);
        System.*out*.println(height+"    "+width+"   "+imageType);
        //长&&宽压缩的比例,内存占用的比例关系是平方倍
        options.inSampleSize=2;
        options.inJustDecodeBounds=false;
        bitmap=BitmapFactory.*decodeResource*(getResources(),R.drawable.*big*,options);
       return bitmap;
    }

1. 获取原图片尺寸

通常我们使用BitmapFactory.decodeResource()方法来从资源文件中读取一张图片并生成一个Bitmap。但如果使用一个BitmapFactory.Options对象,并把该对象的inJustDecodeBounds属性设置为true,decodeResource()方法就不会生成Bitmap对象,而仅仅是读取该图片的尺寸和类型信息:

BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), R.id.myimage, options);
intimageHeight = options.outHeight;
intimageWidth = options.outWidth;
String imageType = options.outMimeType;

2. 根据原图尺寸和目标区域的尺寸计算出合适的Bitmap尺寸

BitmapFactory.Options类有一个参数inSampleSize,该参数为int型,他的值指示了在解析图片为Bitmap时在长宽两个方向上像素缩小的倍数。inSampleSize的默认值和最小值为1(当小于1时,解码器将该值当做1来处理),且在大于1时,该值只能为2的幂(当不为2的幂时,解码器会取与该值最接近的2的幂)。

例如,当inSampleSize为2时,一个2000 x 1000的图片,将被缩小为1000 x 500,相应地,它的像素数和内存占用都被缩小为了原来的1/4:

publicstatic int calculateInSampleSize(
            BitmapFactory.Options options, int reqWidth, int reqHeight) {
    // 原始图片的宽高
    finalint height = options.outHeight;
    finalint width = options.outWidth;
    intinSampleSize = 1;

    if(height > reqHeight || width > reqWidth) {

        finalint halfHeight = height / 2;
        finalint halfWidth = width / 2;

        // 在保证解析出的bitmap宽高分别大于目标尺寸宽高的前提下,取可能的inSampleSize的最大值
        while((halfHeight / inSampleSize) > reqHeight
                && (halfWidth / inSampleSize) > reqWidth) {
            inSampleSize *= 2;
        }
    }

    returninSampleSize;
}

3. 根据计算出的inSampleSize生成Bitmap

publicstatic Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
        intreqWidth, int reqHeight) {

    // 首先设置 inJustDecodeBounds=true 来获取图片尺寸
    finalBitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeResource(res, resId, options);

    // 计算 inSampleSize 的值
    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

    // 根据计算出的 inSampleSize 来解码图片生成Bitmap
    options.inJustDecodeBounds = false;
    returnBitmapFactory.decodeResource(res, resId, options);
}

这里有一点要注意,就是要在第二遍decode之前把inJustDecodeBounds设置回false,生成需要尺寸的bitmap。

4. 调用以上的decodeSampledBitmapFromResource方法,使用自定尺寸的Bitmap

如果你要将一张大图设置为一个100*100的缩略图,执行以下代码:

mImageView.setImageBitmap(decodeSampledBitmapFromResource(
getResources(), R.id.myimage, 100,100));

到此,使用decodeResource()方法将一个大图解析为小尺寸bitmap的应用就完成了。同理还可以使用decodeStream()、decodeFile()等方法做相同的事,原理是一样的。

 

原作者链接    https://www.jianshu.com/u/b070c0bf3abd

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值