在android开发中图片是非常容易造成OOM异常的,大部分情况下,都需要对图片进行压缩展示,本文主要是记录下在开发中常见的几种图片压缩方法

一、质量压缩

保持像素的前提下改变图片的位深及透明度(即:通过算法抹掉(同化)图片中的一些某点附近 相近的像素)达到降低质量压缩文件的目的。 使用场景:将图片压缩后将图片上传到服务器,或者保存到本地,根据实际需求

    /*** 质量压缩* 设置bitmap options属性,降低图片的质量,像素不会减少* 第一个参数为需要压缩的bitmap图片对象,第二个参数为压缩后图片保存的位置* 设置options 属性0-100,来实现压缩(因为png是无损压缩,所以该属性对png是无效的)** @param bmp* @param file*/public static void qualityCompress(Bitmap bmp, File file) {// 0-100 100为不压缩int quality = 20;ByteArrayOutputStream baos = new ByteArrayOutputStream();// 把压缩后的数据存放到baos中bmp.compress(Bitmap.CompressFormat.JPEG, quality, baos);try {FileOutputStream fos = new FileOutputStream(file);fos.write(baos.toByteArray());fos.flush();fos.close();} catch (Exception e) {e.printStackTrace();}}

二、 尺寸压缩

通过减少单位尺寸的像素值,真正意义上的降低像素(通过缩放图片像素来减少图片占用内存大小) 使用场景:缓存缩略图的时候(头像处理)

    /*** 尺寸压缩(通过缩放图片像素来减少图片占用内存大小)** @param bmp* @param file*/public static void sizeCompress(Bitmap bmp, File file) {// 尺寸压缩倍数,值越大,图片尺寸越小int ratio = 8;// 压缩Bitmap到对应尺寸Bitmap result = Bitmap.createBitmap(bmp.getWidth() / ratio, bmp.getHeight() / ratio, Config.ARGB_8888);Canvas canvas = new Canvas(result);Rect rect = new Rect(0, 0, bmp.getWidth() / ratio, bmp.getHeight() / ratio);canvas.drawBitmap(bmp, null, rect, null);ByteArrayOutputStream baos = new ByteArrayOutputStream();// 把压缩后的数据存放到baos中result.compress(Bitmap.CompressFormat.JPEG, 100, baos);try {FileOutputStream fos = new FileOutputStream(file);fos.write(baos.toByteArray());fos.flush();fos.close();} catch (Exception e) {e.printStackTrace();}}

三、 采样率压缩
设置图片的采样率,降低图片像素 好处:是不会先将大图片读入内存,大大减少了内存的使用,也不必考虑将大图片读入内存后的释放事宜。 问题:因为采样率是整数,所以不能很好的保证图片的质量。如我们需要的是在2和3采样率之间,用2的话图片就大了一点,但是用3的话图片质量就会有很明显的下降,这样也无法完全满足我的需要。 GitHub上有名的图片压缩算法采用的就是采样率压缩,他的核心算法就是计算这个采样值

 private int computeSize() {srcWidth = srcWidth % 2 == 1 ? srcWidth + 1 : srcWidth;srcHeight = srcHeight % 2 == 1 ? srcHeight + 1 : srcHeight;int longSide = Math.max(srcWidth, srcHeight);int shortSide = Math.min(srcWidth, srcHeight);float scale = ((float) shortSide / longSide);if (scale <= 1 && scale > 0.5625) {if (longSide < 1664) {return 1;} else if (longSide < 4990) {return 2;} else if (longSide > 4990 && longSide < 10240) {return 4;} else {return longSide / 1280 == 0 ? 1 : longSide / 1280;}} else if (scale <= 0.5625 && scale > 0.5) {return longSide / 1280 == 0 ? 1 : longSide / 1280;} else {return (int) Math.ceil(longSide / (1280.0 / scale));}}

四、图片格式

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 图片压缩最常用的几种方法相关推荐

  1. 最详细的Android图片压缩攻略

    Mr.Louis的博客地址: https://blog.csdn.net/weixin_44005563 最近在研究图片压缩原理,看了大量资料,从上层尺寸压缩.质量压缩原理到下层的哈夫曼压缩,走成华大 ...

  2. Android 图片压缩各种方式

    前言:由于公司项目当中需要用到压缩这块的相应技术,之前也做过的图片压缩都不是特别的理想, 所以这次花了很多心思,仔细研究和在网上找到了很多相对应的资料.为了就是 以后再做的时候直接拿来用就可以了! 第 ...

  3. Android图片压缩(质量压缩和尺寸压缩)Bitmap转成字符串上传

    在网上调查了图片压缩的方法并实装后,大致上可以认为有两类压缩:质量压缩(不改变图片的尺寸)和尺寸压缩(相当于是像素上的压缩):质量压缩一般可用于上传大图前的处理,这样就可以节省一定的流量,毕竟现在的手 ...

  4. 一款现代、高效的 Android 图片压缩框架

    本项目主要基于 Android 自带的图片压缩 API 进行实现,提供了开源压缩方案 Luban 和 Compressor 的实现,解决了单一 Fie 类型数据源的问题,并在它们的基础之上进行了功能上 ...

  5. 最详细的Android图片压缩攻略,让你一次过足瘾

    /   今日科技快讯   / 近日,微软已经通知业务合作伙伴,将从明年开始上调Office办公套件逐月订购的价格,选择逐年订购服务的客户则不会受到影响. 微软宣布将于2022年推出Office全新企业 ...

  6. Android图片压缩(质量压缩和尺寸压缩)

    在网上调查了图片压缩的方法并实装后,大致上可以认为有两类压缩:质量压缩(不改变图片的尺寸)和尺寸压缩(相当于是像素上的压缩):质量压缩一般可用于上传大图前的处理,这样就可以节省一定的流量,毕竟现在的手 ...

  7. android 图片压缩总结1

    在网上调查了图片压缩的方法并实装后,大致上可以认为有两类压缩:质量压缩(不改变图片的尺寸)和尺寸压缩(相当于是像素上的压缩):质量压缩一般可用于上传大图前的处理,这样就可以节省一定的流量,毕竟现在的手 ...

  8. android 图片压缩,bitmap压缩总结

    1.    图片压缩相关概念 在android开发中,图片加载到内存中通常需要占用大量的内存,导致app性能过度消耗,严重的话可能会导致OOM异常,所以对图片进行优化就尤为重要. android图片压 ...

  9. 可能是最详细的Android图片压缩原理分析(二)—— 鲁班压缩算法解析

    本篇文章已授权微信公众号guolin_blog(郭霖)独家发布 稀土掘金链接 前言 通过上一篇,我们了解了一些关于图片压缩的基础知识,这篇文章我们主要讲解一下鲁班压缩的算法逻辑,很多博客都是从Gith ...

最新文章

  1. 微软.net一些类的源码
  2. delegate,event, lambda,Func,Action以及Predicate
  3. JDBC如何连接mysql数据库附详细步骤
  4. C#中修改文件或文件夹的权限,为指定用户、用户组添加完全控制权限
  5. html怎样调取css,css怎么调用?
  6. drools 7.x DSL领域语言入门
  7. Ural 1780 Gray Code 乱搞暴力
  8. 你确定你真的懂Nginx与PHP的交互?
  9. 2014年3月至2014年6月阅读记录(共64项)
  10. c语言餐厅饭卡管理系统,饭卡管理系统
  11. 83行代码通关攻略|据说看的人都过了
  12. ceph osd学习小结
  13. 商用计算机品牌,请问什么牌子的笔记本比较好啊?要商用的
  14. EXCEL学生成绩里计算年级名次、班级名次
  15. 学前端到了CSS阶段,你一定要掌握这9大防御式开发技能
  16. Mac 2020版M1 安装虚拟机各种踩坑详解(关注文末小惊喜哟)
  17. C++ 类与对象_类的其他成员(常成员,静态成员,友元)
  18. 基于matlab菌落影像分割方法,基于MATLAB的图像分割方法及应用-
  19. 中关村科技企业融资缺口700亿 商业银行垂涎
  20. 【钉钉-场景化能力包】群机器人数据报表推送

热门文章

  1. C Templates学习笔记⑧:模板中的名称
  2. 支付宝踩过的坑sign check fail: check Sign and Data Fail��JSON also��
  3. 扫描的pdf文件怎么编辑修改
  4. 层净高怎么算_房屋的层高和净高怎么算?
  5. python- flask current_app详解,与 current_app._get_current_object()的区别以及异步发送邮件实例
  6. Python,让地球转起来
  7. 【毕业设计】 树莓派寝室宿舍门禁刷卡系统 - 物联网 单片机 嵌入式
  8. 3d建模师容易找工作吗?
  9. 《途客圈创业记:不疯魔,不成活》一一2.10 天使投资
  10. 虽然凉了,也要坚强,一名渣硕的阿里菜鸟网络Java三面面经分享