Android 图片压缩最常用的几种方法
在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 图片压缩最常用的几种方法相关推荐
- 最详细的Android图片压缩攻略
Mr.Louis的博客地址: https://blog.csdn.net/weixin_44005563 最近在研究图片压缩原理,看了大量资料,从上层尺寸压缩.质量压缩原理到下层的哈夫曼压缩,走成华大 ...
- Android 图片压缩各种方式
前言:由于公司项目当中需要用到压缩这块的相应技术,之前也做过的图片压缩都不是特别的理想, 所以这次花了很多心思,仔细研究和在网上找到了很多相对应的资料.为了就是 以后再做的时候直接拿来用就可以了! 第 ...
- Android图片压缩(质量压缩和尺寸压缩)Bitmap转成字符串上传
在网上调查了图片压缩的方法并实装后,大致上可以认为有两类压缩:质量压缩(不改变图片的尺寸)和尺寸压缩(相当于是像素上的压缩):质量压缩一般可用于上传大图前的处理,这样就可以节省一定的流量,毕竟现在的手 ...
- 一款现代、高效的 Android 图片压缩框架
本项目主要基于 Android 自带的图片压缩 API 进行实现,提供了开源压缩方案 Luban 和 Compressor 的实现,解决了单一 Fie 类型数据源的问题,并在它们的基础之上进行了功能上 ...
- 最详细的Android图片压缩攻略,让你一次过足瘾
/ 今日科技快讯 / 近日,微软已经通知业务合作伙伴,将从明年开始上调Office办公套件逐月订购的价格,选择逐年订购服务的客户则不会受到影响. 微软宣布将于2022年推出Office全新企业 ...
- Android图片压缩(质量压缩和尺寸压缩)
在网上调查了图片压缩的方法并实装后,大致上可以认为有两类压缩:质量压缩(不改变图片的尺寸)和尺寸压缩(相当于是像素上的压缩):质量压缩一般可用于上传大图前的处理,这样就可以节省一定的流量,毕竟现在的手 ...
- android 图片压缩总结1
在网上调查了图片压缩的方法并实装后,大致上可以认为有两类压缩:质量压缩(不改变图片的尺寸)和尺寸压缩(相当于是像素上的压缩):质量压缩一般可用于上传大图前的处理,这样就可以节省一定的流量,毕竟现在的手 ...
- android 图片压缩,bitmap压缩总结
1. 图片压缩相关概念 在android开发中,图片加载到内存中通常需要占用大量的内存,导致app性能过度消耗,严重的话可能会导致OOM异常,所以对图片进行优化就尤为重要. android图片压 ...
- 可能是最详细的Android图片压缩原理分析(二)—— 鲁班压缩算法解析
本篇文章已授权微信公众号guolin_blog(郭霖)独家发布 稀土掘金链接 前言 通过上一篇,我们了解了一些关于图片压缩的基础知识,这篇文章我们主要讲解一下鲁班压缩的算法逻辑,很多博客都是从Gith ...
最新文章
- 微软.net一些类的源码
- delegate,event, lambda,Func,Action以及Predicate
- JDBC如何连接mysql数据库附详细步骤
- C#中修改文件或文件夹的权限,为指定用户、用户组添加完全控制权限
- html怎样调取css,css怎么调用?
- drools 7.x DSL领域语言入门
- Ural 1780 Gray Code 乱搞暴力
- 你确定你真的懂Nginx与PHP的交互?
- 2014年3月至2014年6月阅读记录(共64项)
- c语言餐厅饭卡管理系统,饭卡管理系统
- 83行代码通关攻略|据说看的人都过了
- ceph osd学习小结
- 商用计算机品牌,请问什么牌子的笔记本比较好啊?要商用的
- EXCEL学生成绩里计算年级名次、班级名次
- 学前端到了CSS阶段,你一定要掌握这9大防御式开发技能
- Mac 2020版M1 安装虚拟机各种踩坑详解(关注文末小惊喜哟)
- C++ 类与对象_类的其他成员(常成员,静态成员,友元)
- 基于matlab菌落影像分割方法,基于MATLAB的图像分割方法及应用-
- 中关村科技企业融资缺口700亿 商业银行垂涎
- 【钉钉-场景化能力包】群机器人数据报表推送
热门文章
- C Templates学习笔记⑧:模板中的名称
- 支付宝踩过的坑sign check fail: check Sign and Data Fail��JSON also��
- 扫描的pdf文件怎么编辑修改
- 层净高怎么算_房屋的层高和净高怎么算?
- python- flask current_app详解,与 current_app._get_current_object()的区别以及异步发送邮件实例
- Python,让地球转起来
- 【毕业设计】 树莓派寝室宿舍门禁刷卡系统 - 物联网 单片机 嵌入式
- 3d建模师容易找工作吗?
- 《途客圈创业记:不疯魔,不成活》一一2.10 天使投资
- 虽然凉了,也要坚强,一名渣硕的阿里菜鸟网络Java三面面经分享