Android小知识-图片的三种压缩方式

作者: 爱读书的顾先生 | 来源:发表于2018-10-01 14:10 被阅读29次
  Android中Bitmap所占内存大小计算方式:图片长度 x 图片宽度 x 一个像素点占用的字节数

1、Bitmap的Compress方法(质量压缩):

public boolean compress(CompressFormat format, int quality, OutputStream stream)

参数format:表示图像的压缩格式,目前有CompressFormat.JPEG、CompressFormat.PNG、CompressFormat.WEBP。

参数quality: 图像压缩率,0-100。 0 压缩100%,100意味着不压缩。

参数stream: 写入压缩数据的输出流。

常用的用法:

public static Bitmap compress(Bitmap bitmap){

    ByteArrayOutputStream baos = new ByteArrayOutputStream();

    bitmap.compress(Bitmap.CompressFormat.JPEG, 90, baos);

    byte[] bytes = baos.toByteArray();

    return BitmapFactory.decodeByteArray(bytes, 0, bytes.length);

}

上面方法中通过bitmap的compress方法对bitmap进行质量压缩,10%压缩,90%不压缩。

图片的大小是没有变的,因为质量压缩不会减少图片的像素,它是在保持像素的前提下改变图片的位深及透明度等,来达到压缩图片的目的,这也是为什么该方法叫质量压缩方法。图片的长,宽,像素都不变,那么bitmap所占内存大小是不会变的。

quality值越小压缩后的baos越小(使用场景:在微信分享时,需要对图片的字节数组大小进行限制,这时可以使用bitmap的compress方法对图片进行质量压缩)。

2、BitmapFactory.Options的inJustDecodeBounds和inSampleSize参数(采样压缩率):

inJustDecodeBounds:当inJustDecodeBounds设置为true的时候,BitmapFactory通过decodeXXXX解码图片时,将会返回空(null)的Bitmap对象,这样可以避免Bitmap的内存分配,但是它可以返回Bitmap的宽度、高度以及MimeType。

inSampleSize: 当它小于1的时候,将会被当做1处理,如果大于1,那么就会按照比例(1 / inSampleSize)缩小bitmap的宽和高、降低分辨率,大于1时这个值将会被处置为2的倍数。例如,width=100,height=100,inSampleSize=2,那么就会将bitmap处理为,width=50,height=50,宽高降为1 / 2,像素数降为1 / 4。

常用用法:

public static Bitmap inSampleSize(Bitmap bitmap,int reqWidth,int reqHeight){

    final BitmapFactory.Options options = new BitmapFactory.Options();

    options.inJustDecodeBounds = true;

    BitmapFactory.decodeByteArray(data, 0, data.length, options);

    options.inSampleSize = calculateInSampleSize(options, reqWidth,

            reqHeight);

    options.inJustDecodeBounds = false;

    return BitmapFactory.decodeByteArray(data, 0, data.length, options);

}

public static int calculateInSampleSize(BitmapFactory.Options options,

                                        int reqWidth, int reqHeight) {

    final int picheight = options.outHeight;

    final int picwidth = options.outWidth;

    int targetheight = picheight;

    int targetwidth = picwidth;

    int inSampleSize = 1;

    if (targetheight > reqHeight || targetwidth > reqWidth) {

        while (targetheight >= reqHeight

                && targetwidth >= reqWidth) {

            inSampleSize += 1;

            targetheight = picheight / inSampleSize;

            targetwidth = picwidth / inSampleSize;

        }

    }

    return inSampleSize;

}
}

inSampleSize方法中先将inJustDecodeBounds设置为false,在通过BitmapFactory的decodeXXXX方法解码图片,返回空(null)的Bitmap对象,同时获取了bitmap的宽高,再通过calculateInSampleSize方法根据原bitmap的 宽高和目标宽高计算出合适的inSampleSize,最后将inJustDecodeBounds设置为true,通过BitmapFactory的decodeXXXX方法解码图片。

3、通过Matrix压缩图片

Matrix matrix = new Matrix();

matrix.setScale(0.5f, 0.5f);

bm = Bitmap.createBitmap(bit, 0, 0, bit.getWidth(),bit.getHeight(), matrix, true);

}



扫码_搜索联合传播样式-微信标准绿版.png

Android、Java、Python、Go、PHP、IOS、C++、HTML等等技术文章,更有各种书籍推荐和程序员资讯,快来加入我们吧!关注技术共享笔记。

838794-506ddad529df4cd4.webp.jpg

定期推送优质文章

相关文章

网友评论

  • 懒Qin:后面两个怎么没有使用场景啊?:smile_cat:
    懒Qin:@BillGu 我是觉得加上案例会更好理解。也更容易想起。谢谢回复
    爱读书的顾先生:@懒Qin 非常感谢你留言,后续会把案例补上,目前本专题的文章都是小短文,适合大家在公交,坐地铁看看,不占用太长时间但能给大家提供点帮助,你可以关注微信公众号-顾林海,不定期更新文章

本文标题:Android小知识-图片的三种压缩方式

本文链接:https://www.haomeiwen.com/subject/ayrnoftx.html