码迷,mamicode.com
首页 > 移动开发 > 详细

也谈android开发图像压缩

时间:2015-08-15 15:01:50      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:android   压缩   图像压缩   

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开发图像压缩

标签:android   压缩   图像压缩   

原文地址:http://blog.csdn.net/u012702547/article/details/47680941

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!