**Android 图片处理系列:图片压缩处理

本文探讨了Android中图片压缩的两种方法:长宽压缩和像素压缩,以及如何使用ExifInterface写入图片属性。文章还建议根据图片大小判断是否需要质量压缩,并推荐使用WebP格式实现更好的压缩效果。
摘要由CSDN通过智能技术生成

Android 图片处理系列:图片压缩处理

由于公司主打的旅游产品,对图片处理的比较多,不仅要处理显示大批量的功能,还要有拍照上传和本地图片上传的功能,这就要求在上传之前需要对图片进行压缩处理,同时需要将照片的附加属性如:创建时间、经纬度等同时上传,所以就需要在把压缩前的图片属性写入压缩后的图片。
一般针对Android压缩图片 :
Android中有两种压缩图片的方法:
第一种是针对图片的长宽进行压缩,在将图片加载到内存过程中将图片的长宽进行压缩,获取长宽压缩版的的图片
第二种是针对图片的像素进行压缩,图片加载到内存后,针对图片质量进行压缩,会导致图片质量下降。
如果不了解上面两种该怎么去进行的可以看这篇文章,我就不再具体写了: http://www.jianshu.com/p/0f56f35068e2
如果不想用Android自带的压缩图片方式可以使用libjpeg库压缩,这就涉及到NDK方面,有兴趣可以看看这篇文章:http://blog.csdn.net/hqiong208/article/details/53667661
先进行长宽压缩:


 /** 
     * 根据路径获得突破并压缩返回bitmap用于显示 
     * @param filePath  图片的路径  需要压缩图片的路径
     * @param reqWidth  要求的图片的像素 根据主流一般720*1280
     * @param reqHeight 要求的图片的像素 
     * @return 
     */  
    public static Bitmap getBitmap(String filePath,int reqWidth, int reqHeight) {  
        final BitmapFactory.Options options = new BitmapFactory.Options();  
        options.inJustDecodeBounds = true;  
        BitmapFactory.decodeFile(filePath, options);  

        options.inSampleSize =  inSampleSize(options, reqWidth, reqHeight);  

        options.inJustDecodeBounds = false;  

        return BitmapFactory.decodeFile(filePath, options);  
    }  

     public static int inSampleSize(BitmapFactory.Options options,int reqWidth, int reqHeight) {  

        final int height = options.outHeight;  
        final int width = options.outWidth;  
        int inSampleSize = 1;  
         if (width<=height){//竖屏拍照
            if (height > reqHeight || width > reqWidth) {
                final int heightRatio = Math.round((float) height
                        / (float) reqHeight);
                final int widthRatio = Math.round((float) width / (float) reqWidth);
                inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
            }
        }else {//横屏
            if (height > reqWidth || width > reqHeight) {
                final int heightRatio = Math.round((float) height
                        / (float) reqWidth);
                final int widthRatio = Math.round((float) width / (float) reqHeight);
                inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
            }
        }
        return inSampleSize;  
    }  

再进行质量压缩,quality(0~100) 自己指定,一般60到70就好,并不会太失真

 /** 
     * @param file 压缩后的图片文件
     * @param bm 
     * @return 
     */  
public static void saveBitmap(Bitmap bm, File file) {//质量
        try {
            FileOutputStream out = new FileOutputStream(file);
            bm.compress(Bitmap.CompressFormat.JPEG, 70, out);
            out.flush();
            out.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

写入图片属性:采用的是ExifInterface,代码有点多就不贴了,其实也很简单主要就是getAttribute,setAttribute,saveAttributes,不了解可以查查,非常简单。
当然具体情况具体分析,如果是拍照上传,一般都是1M以上,长宽质量都要压缩,但是本地图片上传,有的只有100多k或更小,那么质量压缩是否可以不要压缩或者 quality设置更高一点,这需要根据实际来判断。
实际达到的效果,拍照后2、3M的照片压缩后只有200k左右,基本不失真。

最后推荐一种压缩格式WebP,亲身体检在相同方式下WebP格式压缩会比Jpng更小接近一倍的体积,而且效果差不多。可以看看这篇文章:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2016/0527/4302.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值