Bitmap图片压缩

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Bitmap图片压缩相关的知识,希望对你有一定的参考价值。

参考技术A 图片压缩就是为了避免我们内存的溢出。而BitMap是android系统中对图像处理最重要的一个类,所以我们可以用他来对图像进行剪切,压缩,一系列操作。常用的压缩方法有质量压缩,采样率压缩,缩放法压缩,RGB_565压缩等。

质量压缩

质量压缩不会减少图片的像素,他是在保持像素的前提下来改变图片的透明度,但是图片的长,宽,像素都不会变,所以他占用的内存也不会改变。

采样率压缩

采样率压缩其实就是缩放bitamp的尺寸,通过调节其inSampleSize参数,比如调节为2,宽高会为原来的1/2,宽高都减少了,内存自然也就减少了。

缩放法压缩

放缩法压缩使用的是通过矩阵对图片进行裁剪,也是通过缩放图片尺寸,来达到压缩图片的效果,和采样率的原理一样

RGB_565压缩

这是通过压缩像素占用的内存来达到压缩的效果,一般不建议使用ARGB_4444,因为画质实在是辣鸡,如果对透明度没有要求,建议可以改成RGB_565,相比ARGB_8888将节省一半的内存开销。

图片二次采样压缩

1.第一次采样

inJustDecodeBounds设置为ture,只会加载图片的边框,不会加载图片的具体内容。

2.根据原图的宽高,结合控件的宽高计算出缩放比例,然后通过inSamplesize(in 三pou Size)对图片进行尺寸的缩放。

3.二次采样时需要将图片加载出来显示,不能只加载图片的框架,因此inJustDecodeBounds属性要设置为false。

Android 之 图片压缩

在上一篇文章中(Android之图片变换)主要说明了bitmap的使用,当然其中也包括一点图片压缩的内容,但是没有详细描述,这篇文章就来阐述一下平时Android使用的图片压缩技术

从图片的压缩方式区分:质量压缩和尺寸压缩。

质量压缩是在保持像素的前提下改变图片的位深及透明度等,来达到压缩图片的目的,经过它压缩的图片文件大小会有改变,但是导入成bitmap后占得内存是不变的。因为要保持像素不变,所以它就无法无限压缩,到达一个值之后就不会继续变小了。显然这个方法并不适用与缩略图,其实也不适用于想通过压缩图片减少内存的适用,仅仅适用于想在保证图片质量的同时减少文件大小的情况而已

尺寸压缩是压缩图片的像素,一张图片所占内存的大小 图片类型*宽*高,通过改变三个值减小图片所占的内存,防止OOM,当然这种方式可能会使图片失真

质量压缩:

public Bitmap compressImage(Bitmap image,int imageSize) {  

        ByteArrayOutputStream baos = new ByteArrayOutputStream();  
        image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中  
        int options = 100;  
        while ( baos.toByteArray().length / 1024>imageSize) {  //循环判断压缩后图片是否大于100kb,大于继续压缩         
            baos.reset();//重置baos即清空baos  
            image.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中  
            options -= 10;//每次都减少10  
        }  
        ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中  
        Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream数据生成图片  
        return bitmap;  
    } 

尺寸压缩:

public void scalePic(int reqWidth,int reqHeight) {
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeResource(getResources(), R.mipmap.demo, options);
        options.inSampleSize = PhotoUtil.calculateInSampleSize(options, reqWidth,reqHeight);
        options.inJustDecodeBounds = false;
        bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.demo, options);

        postInvalidate();
    }
public static int calculateInSampleSize(BitmapFactory.Options options,int reqWidth, int reqHeight) {
        final int height = options.outHeight;
        final int width = options.outWidth;
        int inSampleSize = 1;
        if (height > reqHeight || width > reqWidth) {
            final int heightRatio = Math.round((float) height / (float) reqHeight);
            final int widthRatio = Math.round((float) width / (float) reqWidth);
            inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
        }
        return inSampleSize;
    }

根据具体需求也可以两种压缩方式结合使用

以上是关于Bitmap图片压缩的主要内容,如果未能解决你的问题,请参考以下文章

android 图片质量压缩和尺寸压缩有啥区别

Bitmap/png转成jpg格式,压缩图片

转:Bitmap的六种压缩方式

Android 之 图片压缩

Android中处理大图片时图片压缩

Android压缩图片和libjpeg库