Android压缩图片至指定大小的小问题

近日在做一款饭否第三方客户端,饭否对于图片上传有着严格的大小限制(店小成本问题,┑( ̄Д  ̄)┍),GIF大小2M,静态图4M,即便如此,大部分拍照的图片都是超过4M大小的。

最开始使用的是Luban,但是经常出现该库读取Exif信息的时候出错崩溃,导致压根不压缩,所以想着自己写。

网上有一个压缩图片的片段比较好,思想是对JPEG图片的质量参数进行尝试,从100开始,做循环压缩,每次降低10,直到大小符合要求,代码如下:

    public static void compressBmpToFile(Bitmap bmp,File file){  
        ByteArrayOutputStream baos = new ByteArrayOutputStream();  
        int options = 80;//个人喜欢从80开始,  
        bmp.compress(Bitmap.CompressFormat.JPEG, options, baos);  
        while (baos.toByteArray().length / 1024 > 100) {   
            baos.reset();  
            options -= 10;  
            bmp.compress(Bitmap.CompressFormat.JPEG, options, baos);  
        }  
        try {  
            FileOutputStream fos = new FileOutputStream(file);  
            fos.write(baos.toByteArray());  
            fos.flush();  
            fos.close();  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }

但是在实践过程中,发现此段代码有较为严重的性能问题,核心在于baos.toByteArray().length,查阅Android文档如下:

toByteArray()

作为一个尝试获取压缩后大小的操作每次都重新分配大小是不合适的,需要获取压缩后占用空间,可以直接使用ByteArrayOutputStream.size()即可,查阅其源代码,size()返回流内部数组的大小,免去了重复分配且复制的操作。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,004评论 25 708
  • 点击查看原文 Web SDK 开发手册 SDK 概述 网易云信 SDK 为 Web 应用提供一个完善的 IM 系统...
    layjoy阅读 13,888评论 0 15
  • 先发一张昨天去看我雷哥演唱会的皂片然后再说正文哈哈。 简介 由于工作原因,boss下达的任务就大概说了对图片进行压...
    我叫王菜鸟阅读 5,280评论 2 16
  • 前言 在一次偶然的情况下,在简书上看到 一句代码搞定 Android 图片压缩 真的是打瞌睡碰到了枕头啊~ 因为最...
    橙一升阅读 2,388评论 1 12
  • 读《天朝的崩溃》至第四百页,朝廷已经安排戌边的大臣们尾追英军求“抚”,有趣的是,此时英军忙于攻城拔寨,移动得快,居...
    ichth阅读 144评论 0 1