在提图片压缩之前,我先总结下图片的三种常见格式:JPEG,JPG,PNG

Jpeg格式  
与jpg格式相似,经常在拷相片的时候看到得,但我们制作图片的时候一般是保存jpg,该种图片格式是文件相对jpg大,因为里面存储了很多相机里的拍摄参数,像色相、饱和度、对比度等 
1.可支持有陨压缩 
2.不支持透明 
3.不支持动画 
4.非矢量

5.有损压缩

可用于直接打印和印刷(相对于jpg要好)

Jpg格式  
1.这种格式是最常见的,也是用的最多的图片格式,很受大众的喜爱; 
2.Jpg图片其实一生成出来就已经是有损的了,他是把一些不打算存储的数据抹擦掉, 
3.可支持有陨压缩 
4.不支持透明 
5.不支持动画 
6.非矢量 
7.色彩还原度比较好,可以支持适当压缩后保持比较好的色彩度 
如果你图片颜色很多的,建议使用这个图片格式,可以使生成的图片大小比较小而不会使图片看起来很模糊(失真)

Png格式  
  该格式是在网页中用的较多的一种格式,因为他支持特明 
1.无损压缩 
2.支持透明、半透明、不透明 
3.不支持动画 
4.非矢量 
5.网页设计中为了使图片下面的背景颜色显示出来,我们经常会使用png24透明的图片, 
6.Png8是类似gif的透明度,有带半透明(alpha为50%)的地方的时候以不透明处理。 
7.Png图片如果色彩较多或复杂,则图片生成后的格式是很大的,相比较jpg的放有5~6倍之多,所以没特别要求不能以png替代jpg的使用 
8.Png图片多用于网页中的图标设计 
IE6不支持png透明特性,有png的地方会以灰色底显示,相当难看,不过ie6已经慢慢淡出了我们的视线,相信png的应用会得到更广泛。


1.质量压缩法

在使用图片质量压缩,我发现一个有趣的现象,一个本地2M左右的照片,需要压缩到200K以下,在压缩时,压缩比例阶梯递减,照片大小,越压缩到后面,越小减少量依次是:3755-->

558-->203-->105-->54-->42-->30-->24-->22-->14:(由此可见减量24-->22-->14,意义不大,建议在判断时,剔除这部分)

代码如下:

  public  void compress(File file){ Log.i("TAG", file.getPath());Bitmap bitmap = BitmapFactory.decodeFile(file.getPath());ByteArrayOutputStream baos = new ByteArrayOutputStream();int pos= 100;bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压while(baos.size()/1024>200) {Log.i("TAG", baos.size()/1000+"k=============="+pos);pos -=10;baos.reset();bitmap.compress(Bitmap.CompressFormat.JPEG, pos, baos);  }try {FileOutputStream fos = new FileOutputStream(Environment.getExternalStorageDirectory().getAbsolutePath()+"/SHMedia/Photos/1234.jpg");baos.writeTo(fos);//将流写入文件} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}

2.比例压缩法

比例压缩法,比如图片大于16M时,会造成oom,那么就需要,进行压缩,其中的参数 opts.inSampleSize = 8;即2的3次方,那么压缩后图片的大小就变成原来的1/3

使用bii压缩法时注意两点.

①:opts.inSampleSize = 8;的含义,是2三次方,如果未压缩前是15M,那么压缩后就是5M

②:opts.inJustDecodeBounds = true;将该参数设置为 true 则加载器不加载图片, 而是把图片的 out(宽和高)的字段信息取出来

opts.inJustDecodeBounds = false; // 加载器就会返回图片了

示例代码:

 public  void compress1(File file){ BitmapFactory.Options opts = new BitmapFactory.Options();// 设置为ture只获取图片大小opts.inJustDecodeBounds = true;opts.inPreferredConfig = Bitmap.Config.ARGB_8888;// 获取到屏幕对象Display display = getWindowManager().getDefaultDisplay();// 获取到屏幕的真是宽和高int screenWidth = display.getWidth();int screenHeight = display.getHeight();// 计算缩放比例int widthScale = opts.outWidth /screenWidth;int heightScale = opts.outHeight /screenHeight;int samPle = Math.max(widthScale,heightScale);opts.inSampleSize = 2;opts.inJustDecodeBounds = false;Bitmap bitmap = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory().getAbsolutePath()+"/SHMedia/Photos/123.jpg", opts);try {bitmap.compress(Bitmap.CompressFormat.JPEG, 100, new FileOutputStream(new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/SHMedia/Photos/123.jpeg")));} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}

总结:建议使用时,使用混合压缩法,即二者的结合.

安卓中两种压缩图片详解(比例压缩与质量压缩)相关推荐

  1. Redis 中两种持久化机制详解

    Redis 持久化机制(快照.AOF) 快照 (Snapshot) 1. 客户端方式之 BGSAVE(多线程执行) 2. 客户端方式之 SAVE(单线程执行) 3. 服务器配置方式之 配置快照触发条件 ...

  2. PCBA加工中常见的两种焊接方式详解

    PCBA加工中常见的两种焊接方式详解 PCBA加工,两种常见的焊接方式就是回流焊和波峰焊,与手动焊接技术相比,自动焊接技术具有减少人为因素的影响.提高效率.降低成本.提高质量等优势,在PCBA加工中, ...

  3. C语言getline函数CSDN,c++中的两种getline用法详解

    getline是C++标准库函数:但不是C标准库函数,而是POSIX(IEEE Std 1003.1-2008版本及以上)所定义的标准库函数(在POSIX IEEE Std 1003.1-2008标准 ...

  4. 约瑟夫环问题的两种解法(详解)

    约瑟夫环问题的两种解法(详解) 题目: Josephus有过的故事:39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓.于是决定了自杀方式,41个人排成一个圆 ...

  5. linux apache两种工作模式详解

    apache两种工作模式详解 刚接触这两个配置时很迷糊,全部开启或全部注释没有几多变化.今天搜索到这么一篇讲得还不错的文章,看了几篇,还是不能完全记住,做一个收藏. 空闲子进程:是指没有正在处理请求的 ...

  6. java的websocket_java 实现websocket的两种方式实例详解

    一.介绍 1.两种方式,一种使用tomcat的websocket实现,一种使用spring的websocket 2.tomcat的方式需要tomcat 7.x,JEE7的支持. 3.spring与we ...

  7. python类的命名空间_Python之关于类变量的两种赋值区别详解

    我就废话不多说了,还是直接看代码吧! # -*- coding:utf-8 -*- #面试题,写一个方法,将一行字符串中所有的单词数量统计出来 class Person(object): TAG = ...

  8. oracle数据库按日期查询,关于Oracle数据库日期范围查询的两种实现方法详解,oracle详解...

    关于Oracle数据库日期范围查询的两种实现方法详解,oracle详解 Oracle数据库日期范围查询有两种方式:to_char方式和to_date方式,接下来我们通过一个实例来介绍这一过程.我们假设 ...

  9. redis的两种持久化方式详解

    一.背景 在实际开发中,为了保证数据的完整性,防止数据丢失,我们除了在原有的传统数据库保存数据的同时,最好是再用redis持久化再保存一次数据.如果仅仅是使用redis而不进行持久化配置的话,当red ...

最新文章

  1. 利用负载均衡优化和加速HTTP应用
  2. Alpha fold: 人工智能在蛋白质结构预测上跑赢人类的启示
  3. linux内存操作----kernel 3.5.X copy_from_user()和copy_to_user()
  4. Spark SQL and DataFrame for Spark 1.3
  5. very important tip - when to add / in binding path Fiori
  6. Amazon、Linux基金会开发边缘网络交换器操作系统
  7. ros中move_group的参数动态设置
  8. 计算机基础理论知识梳理篇(二):目态(用户态)、管态(内核态)
  9. git 常用命令及虚拟机服务器仓库搭建
  10. 计算机word宿舍管理软件,【UML课程设计】宿舍管理系统设计(WORD完整版).doc
  11. matlab符号函数绘图法_matlab中怎么创建符号函数?
  12. u盘安全删除 linux,如何安全删除U盘技巧
  13. 计算机程序可以通过删除卸载嘛,怎么彻底卸载电脑软件程序多种方法
  14. 熊出没之伐木机器人_熊出没:最强大的4大机器人登场,熊大熊二“苦不堪言”...
  15. 浙江高职考计算机专业本科,浙江高职自主招生考什么科目
  16. Cesium 地形图
  17. 安卓机自动肝手游脚本
  18. Rasa NLU 实践
  19. app如何助推用户从pc端转向手机端
  20. 微信小游戏制作坦克大战(六)碰撞检测,主角坦克碰到敌方坦克、炮弹爆炸

热门文章

  1. F - Queen Collision (模拟题,找规律)
  2. Windows下pytorch-gpu安装以及CUDA详细安装过程 附带各个版本安装包
  3. srsLTE 源码分析 UE_08 随机接入 之开启前的准备
  4. 智能蓝牙脂肪秤开发方案
  5. 闻伟拟将团车网私有化:7个季度亏损接近3亿元,有股东大幅减持
  6. 懂商业的技术合伙人(1):你是怎样成为打工仔的
  7. 幼师学计算机心得体会怎么写,幼儿教师理论学习心得多篇
  8. html让视频跟图片之间无缝,图片、样式、音视频之间的无缝拼接,教你一个万能方法!...
  9. Django 中间件之限制ip访问次数 和 黑名单
  10. win10 nas搭建_树莓派之实现简单的家庭NAS