也谈android开发图像压缩

时间:2022-09-29 16:43:55

long long ago,给学院做的一个通讯录App需要有一个上传图像的功能,冥思苦想,绞尽脑汁后来还是没解决(学生时代的事),于是就直接上传原图了,一张图片2M到3M,这样我的应用发布之后,那绝对是流量杀手。最近有意无意看到了一些android中图像压缩的文章,现在总结出来与大家分享一下。


方式一

我在android开发之bitmap使用这篇博文结束的时候介绍了bitmap图像压缩的事,但是由于时间原因没有细说,bitmap在转化为流的过程中可以进行压缩,前提是不能压缩为一些无损压缩格式,比如PNG,我们可以把图像压缩为jpg格式。至于怎么获得一个Bitmap对象,请参考android开发之bitmap使用

看两行代码,格式要选择为非PNG格式才可以压缩:

FileOutputStream out = new FileOutputStream(path + "456.gif");
//0意味着压缩到最小,100意味着压缩后的质量最好,PNG是无损图像,会忽略这个参数
// bp.compress(Bitmap.CompressFormat.JPEG, 100, out);
bp.compress(Bitmap.CompressFormat.PNG, 0, out);
out.flush();
out.close();

这是利用Bitmap自带的方法来进行压缩,但是用过之后你会发现者这种方式压缩得到的图片质量其实特别差。


方式二

要想获得压缩质量好的图片,我们可采用另外一种方式,在BitmapFactory中的几个获得Bitmap对象的方法中,几乎每一种方式都提供了option参数,这个参数我在上文中也有详细的介绍:

inPreferredConfig 指定decode到内存中,手机中所采用的编码,可选值定义在Bitmap.Config中。缺省值是ARGB_8888。

inJustDecodeBounds 如果设置为true,并不会把图像的数据完全解码,亦即decodeXyz()返回值为null,但是Options的outAbc中解出了图像的基本信息。

inSampleSize 设置decode时的缩放比例。当值大于1时会对图像进行压缩,比如设置为4时,返回的图像宽高都将是原始图像的四分之一,像素是原始图像的十六分之一,如果设置的值小于1,则会被当作1来处理。注意,这里设值必须是2的次幂,其他值会被就近取离2的次幂最近的值。

于是一个新的压缩思路就出炉了:先设置inJustDecodeBounds为true,拿到图像的基本信息,比如宽和高,如果图像的宽和高大于目标宽高,那我们通过移位运算减少宽高,直至我们想要的值。然后根据这个值,设置inSampleSize的值,这样就会拿到一个失真较小的压缩后图像了。

核心代码:

        while (true) {
if ((options.outWidth >> i <= 2000)
&& (options.outHeight >> i <= 2000)) {
in = new BufferedInputStream(
new FileInputStream(new File(path)));
options.inSampleSize = (int) Math.pow(2.0D, i); // 幂运算 i为几次方
options.inJustDecodeBounds = false;
bitmap = BitmapFactory.decodeStream(in, null, options);
break;
}
i += 1;
}

本文完整代码下载

版权声明:本文为博主原创文章,未经博主允许不得转载。若有错误地方,还望批评指正,不胜感激。

也谈android开发图像压缩的更多相关文章

  1. 浅谈 Android 开发文化

    Hello,亲爱的读者朋友们(希望你们是 Android 开发者,或者正在成为 Androider 的路上-)! 质量从用户反馈很清凉然后我们就只能看 CPU 原来的想法是但是事实上不是这些但是我们可 ...

  2. Android开发自学笔记&lpar;Android Studio&rpar;&mdash&semi;4&period;1布局组件

    一.引言 Android的界面是有布局和组件协同完成的,布局好比是建筑里的框架,而组件则相当于建筑里的砖瓦.组件按照布局的要求依次排列,就组成了用户所看见的界面.在Android4.0之前,我们通常说 ...

  3. 安卓开发&lowbar;浅谈Android动画(四)

    Property动画 概念:属性动画,即通过改变对象属性的动画. 特点:属性动画真正改变了一个UI控件,包括其事件触发焦点的位置 一.重要的动画类及属性值: 1.  ValueAnimator 基本属 ...

  4. Android开发-浅谈架构&lpar;二&rpar;

    写在前面的话 我记得有一期罗胖的<罗辑思维>中他提到 我们在这个碎片化 充满焦虑的时代该怎么学习--用30%的时间 了解70%该领域的知识然后迅速转移芳草鲜美的地方 像游牧民族那样.原话应 ...

  5. 浅谈Android移动开发程序员的职业发展之路

    现在几乎每个it公司都在开发移动产品,我最早知道Android还是在09年成都某学院上大学的时候,从新闻上知道有这么一家公司,创始人安迪·鲁宾很有名,但安卓到底是做什么的,我并没有关注. 到2010年 ...

  6. Android开发App工程结构搭建

    本文算是一篇漫谈,谈一谈关于android开发中工程初始化的时候如何在初期我们就能搭建一个好的架构.      关于android架构,因为手机的限制,目前我觉得也确实没什么大谈特谈的,但是从开发的角 ...

  7. Android开发资源推荐第2季

    Android CPU监控想法,思路,核心技术和代码 Android App /Task/Stack 总体分析 http://www.eoeandroid.com/thread-161703-1-1. ...

  8. 帮朋友急招PHP、Android开发工程师 西安 工资8k-12k

    PHP高级工程师岗位要求: 1. 有两年以上PHP开发经验, 2. 精通PHP+MySQL程序设计及开发,拥有良好的代码习惯,要求结构清晰,命名规范,逻辑性强,代码冗余率低. 3. 熟悉面向对象的软件 ...

  9. 浅谈Android手机木马手工查杀

    这篇文章主要是浅谈,所以会从简单方面开始讲起. 关于手机木马查杀,有些人会说安装手机杀毒软件不就解决了吗? 其实不然.因为手机和PC不一样,手机反木马技术没有PC端那么强. 就算你把目前市面上的所有手 ...

随机推荐

  1. HTML5模仿逼真地球自转

    查看效果:http://hovertree.com/texiao/html5/8.htm 给我一个支点,我就可以撬动地球 阿基米德 下载 http://hovertree.com/down/h/ear ...

  2. centos7 firewall 防火墙 命令

    为了架设ss在vultr上买了一个日本的vps 用的是centos7的系统 防火墙是 firewall 捣鼓了两天 在这里总结一下. 如果小伙伴也准备在vultr上买vps  在注册是 可以使用这个优 ...

  3. hadoop集群之HDFS和YARN启动和停止命令

    假如我们只有3台linux虚拟机,主机名分别为hadoop01.hadoop02和hadoop03,在这3台机器上,hadoop集群的部署情况如下: hadoop01:1个namenode,1个dat ...

  4. webp图片详解

    WebP(发音 weppy),是一种支持有损压缩和无损压缩的图片文件格式,派生自图像编码格式 VP8.根据 Google 的测试,无损压缩后的 WebP 比 PNG 文件少了 45% 的文件大小,即使 ...

  5. &num;20155232《网络对抗》Exp9 Web安全基础

    20155232<网络对抗>Exp9 Web安全基础 本实践的目标理解常用网络攻击技术的基本原理.Webgoat实践下相关实验. 实验过程 WebGoat Webgoat是OWASP组织研 ...

  6. Ant scp upload文件至linux server&lpar;用java调用Ant api&rpar;

    1.要准备的jar包:ant.jar,ant-jsch.jar code: package com.test.utils; import org.apache.tools.ant.Project; i ...

  7. css3文字截断

    width:200px; height:14px; overflow:hidden; white-space:nowrap; text-overflow:ellipsis; text-overflow ...

  8. &lbrack;转帖&rsqb; &period;net 2&period;1 是 LTS长期支持版本&period;

    [翻译] .NET Core 2.1 发布   原文: Announcing .NET Core 2.1 我们很高兴可以发布 .NET Core 2.1.这次更新包括对性能的改进,对运行时和工具的改进 ...

  9. Python3【基础】-表达式与运算符

    一.什么是表达式? 1+2*3就是一个表达式,这里的加号和乘号叫做运算符,1.2.3叫做操作数.1+2*3计算的结果是7,计算结果可以存到一个变量中,即:res = 1 + 2 * 3. 所谓的表达式 ...

  10. Effective Java部分读书笔记

    2.创建和销毁对象 1.使用静态工厂方法代替构造器 一般使用构造器(构造函数)创建对象实例,还可以使用静态工厂方法来创建对象实例. 优点 使用静态工厂方法代替构造器创建对象实例有以下优点: 1)静态构 ...