Android小知识之图片的3种压缩方式小结

 更新时间:2018年10月22日 08:29:24   作者:顾林海  
这篇文章主要给大家介绍了关于Android小知识之图片的3种压缩方式的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

设置图片格式

Android目前常用的图片格式有png,jpeg和webp,

png:无损压缩图片格式,支持Alpha通道,Android切图素材多采用此格式

jpeg:有损压缩图片格式,不支持背景透明,适用于照片等色彩丰富的大图压缩,不适合logo

webp:是一种同时提供了有损压缩和无损压缩的图片格式,派生自视频编码格式VP8,从谷歌官网来看,无损webp平均比png小26%,有损的webp平均比jpeg小25%~34%,无损webp支持Alpha通道,有损webp在一定的条件下同样支持,有损webp在Android4.0(API 14)之后支持,无损和透明在Android4.3(API18)之后支持

采用webp能够在保持图片清晰度的情况下,可以有效减小图片所占有的磁盘空间大小

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方法解码图片(使用场景:比如读取本地图片时,防止Bitmap过大导致内存溢出)。

3、通过Matrix压缩图片

Matrix matrix = new Matrix();

matrix.setScale(0.5f, 0.5f);

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

}

使用场景:自定义View时,对图片进行缩放、旋转、位移以及倾斜等操作,常见的就是对图片进行缩放处理,以及圆角图片等。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • Android textview 实现长按自由选择复制功能的方法

    Android textview 实现长按自由选择复制功能的方法

    下面小编就为大家带来一篇Android textview 实现长按自由选择复制功能的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • Android小程序实现切换背景颜色

    Android小程序实现切换背景颜色

    这篇文章主要介绍了Android小程序实现切换背景颜色,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • 基于自定义Toast全面解析

    基于自定义Toast全面解析

    下面小编就为大家带来一篇基于自定义Toast全面解析。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • Android 实现钉钉自动打卡功能

    Android 实现钉钉自动打卡功能

    这篇文章主要介绍了Android 实现钉钉自动打卡功能的步骤,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下
    2021-03-03
  • Android 通过SQLite数据库实现数据存储管理

    Android 通过SQLite数据库实现数据存储管理

    SQLiteOpenHelper 是Android 提供的一个抽象工具类,负责管理数据库的创建、升级工作。本文主要介绍了如何使用SQLite数据库实现对数据进行存储管理,感兴趣的可以了解一下
    2021-11-11
  • Android Bitmap的加载优化与Cache相关介绍

    Android Bitmap的加载优化与Cache相关介绍

    这篇文章主要介绍了Android中性能优化之Bitmap的加载优化与Cache相关内容介绍,文中介绍的很详细,对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。
    2017-02-02
  • Android通过PHP服务器实现登录功能

    Android通过PHP服务器实现登录功能

    这篇文章主要为大家详细介绍了Android通过PHP服务器实现登录功能的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • Android实现仿网易新闻的顶部导航指示器

    Android实现仿网易新闻的顶部导航指示器

    这篇文章主要介绍了Android实现仿网易新闻的顶部导航指示器的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-08-08
  • 解决Android 源码编译错误的问题

    解决Android 源码编译错误的问题

    这篇文章主要介绍了解决Android 源码编译错误的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • Flutter app页面路由以及路由拦截的实现

    Flutter app页面路由以及路由拦截的实现

    本篇介绍了介绍了Flutter如何使用路由来实现页面的跳转,从而简化页面之间的耦合,并可以实现路由拦截。
    2021-06-06

最新评论