e-works数字化企业网  »  文章频道  »  基础信息化  »  移动应用

Android 中图片压缩分析(上)

2017/11/14    来源:腾读去    作者:佚名      
关键字:Android   压缩分析  
在 Android 中进行图片压缩是非常常见的开发场景,主要的压缩方法有两种:其一是质量压缩,其二是下采样压缩。
    一、前言
 
    在 Android 中进行图片压缩是非常常见的开发场景,主要的压缩方法有两种:其一是质量压缩,其二是下采样压缩。
 
    前者是在不改变图片尺寸的情况下,改变图片的存储体积,而后者则是降低图像尺寸,达到相同目的。
 
    由于本文的篇幅问题,分为上下两篇发布。
 
    二、Android 质量压缩逻辑
 
    在Android中,对图片进行质量压缩,通常我们的实现方式如下所示:
 
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
 
    //quality 为0~100,0表示最小体积,100表示最高质量,对应体积也是最大
 
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);
 
    在上述代码中,我们选择的压缩格式是CompressFormat.JPEG,除此之外还有两个选择:
 
    其一,CompressFormat.PNG, PNG 格式是无损的,它无法再进行质量压缩,quality 这个参数就没有作用了,会被忽略,所以最后图片保存成的文件大小不会有变化;
 
    其二,CompressFormat.WEBP ,这个格式是 google 推出的图片格式,它会比 JPEG 更加省空间,经过实测大概可以优化 30% 左右。
 
    由于项目原因和兼容性选择了JPEG,因此接下来的分析也将是围绕 JPEG 展开。
 
    将 PNG 图片转成 JPEG 格式之后不会降低这个图片的尺寸,但是会降低视觉质量,从而降低存储体积。同时,由于尺寸不变,所以将这个图片解码成相同色彩模式的 bitmap 之后,占用的内存大小和压缩前是一样的。
 
    回到最初的代码示例,函数 compress 经过一连串的 java 层调用之后,最后来到了一个 native 函数,如下:
 
Android 中图片压缩分析(上)
Android 中图片压缩分析(上)
 
    可以看到最后调用了函数 encoder->encodeStream(....) 编码保存本地。该函数是调用 skia 引擎来对图片进行编码压缩,对 skia 的介绍将在后文展开。
 
    一段完整的示例代码如下:
 
Android 中图片压缩分析(上)
 
    首先,我们来看看 quality 参数被设置为 50,质量压缩前后的图片对比,可以看到其尺寸大小并没有变化,但是视觉感受也可以明显地看到图片变的模糊了一些。
 
Android 中图片压缩分析(上)
 
    通过日志也可以看到,在质量压缩前后图片转成 Bitmap 之后在内存中的大小也并没有变化,这是在保持像素的前提下,改变图片的位深及透明度等:
 
  Android 中图片压缩分析(上)
 
    对比二者,保存前的图片存储体积是 106k,质量设为 50 并且保存为 JPEG 格式之后,图片存储大小就只有 8k 了,并且质量设的越低,保存成文件之后,文件的体积也就越小。
 
    三、Android Skia 图像引擎
 
    在上文中,提到的Skia是Android 的重要组成部分。
 
    Skia 是一个 Google 自己维护的 c++ 实现的图像引擎,实现了各种图像处理功能,并且广泛地应用于谷歌自己和其它公司的产品中(如:Chrome、Firefox、 Android等),基于它可以很方便为操作系统、浏览器等开发图像处理功能。
 
    Skia 在 Android 中提供了基本的画图和简单的编解码功能,可以挂接其他的第三方编码解码库或者硬件编解码库,例如 libpng 和 libjpeg,libgif 等等。因此,这个函数调用bitmap.compress(Bitmap.CompressFormat.JPEG...),实际会调用 libjpeg.so 动态库进行编码压缩。
 
    最终 Android 编码保存图片的逻辑是 Java 层函数→Native 函数→Skia函数→对应第三库函数(例如 libjpeg)。所以 skia 就像一个胶水层,用来链接各种第三方编解码库,不过 Android 也会对这些库做一些修改,比如修改内存管理的方式等等。
 
责任编辑:李欢
本文为授权转载文章,任何人未经原授权方同意,不得复制、转载、摘编等任何方式进行使用,e-works不承担由此而产生的任何法律责任! 如有异议请及时告之,以便进行及时处理。联系方式:editor@e-works.net.cn tel:027-87592219/20/21。
e-works
官方微信
掌上
信息化
编辑推荐
新闻推荐
博客推荐
视频推荐