Android NDK开发中libjpeg-turbo、libpng、libwebp图像压缩库的使用方法(一)

文章允许转载,请注明来源:http://blog.csdn.net/feiniao8651/article/details/78620285

引言

gif,png,jpg,以及最近几年逐渐崛起的的webp,都是大家常见的图像格式。之前开发程序的时候,一般都是调用系统封装好的图像api,难得有机会在代码里直接调用这些库。最近在做项目过程中,使用这些库的时候,一直苦于没有一个全面完整的说明,需要每个库分别去查资料,访问相应的官网,所以在这里做一个汇总。

基本介绍

首先科普一下常见的图像格式 。这些图片格式不是某个组织统一规定,每个格式分别属于不同的团体或组织。人们根据不同的时期的需求,创造出了相应的图片格式。

GIF(Graphics Interchange Format) 图像互换格式

诞生于 1987 年,随着初代互联网流行开来。文件通常用8位来表示色彩,是一种基于LZW算法的无损压缩格式,压缩率一般在50%左右。它有很多缺点,比如通常情况下只支持 256 种颜色、透明通道只有 1 bit、文件压缩比不高。它唯一的优势就是支持多帧动画,凭借这个特性,它得以从 Windows 1.0 时代流行至今,而且仍然大受欢迎。

PNG(Portable Network Graphics) 便携式网络图形

诞生在 1995 年,比 JPEG 晚几年。它本身的设计目的是替代 GIF 格式,所以它与 GIF 有更多相似的地方。PNG 只支持无损压缩,所以它的压缩比是有上限的。相对于 JPEG 和 GIF 来说,它最大的优势在于支持完整的透明通道。

JPG/JPEG(Joint Photographic Experts Group) 联合图像专家小组

是目前最常见的图片格式,它诞生于 1992 年,是一个很古老的格式。它只支持有损压缩,其压缩算法可以精确控制压缩比,以图像质量换得存储空间。由于它太过常见,以至于许多移动设备的 CPU 都支持针对它的硬编码与硬解码。

在上面这些图片格式诞生后,也有不少公司或团体尝试对他们进行改进,或者创造其他更加优秀的图片格式,比如 JPEG 小组的 JPEG 2000、微软的 JPEG-XR、Google 的 WebP、个人开发者发布的 BPG、FLIF 等。它们相对于老牌的那几个图片格式来说有了很大的进步,但出于各种各样的原因,只有少数几个格式能够流行开来。下面三种就是目前实力比较强的新兴格式了:

APNG(Animated Portable Network Graphics)

是 Mozilla 在 2008 年发布的一种图片格式,旨在替换掉画质低劣的 GIF 动画。它实际上只是相当于 PNG 格式的一个扩展,所以 Mozilla 一直想把它合并到 PNG 标准里面去。然而 PNG 开发组并没有接受 APNG 这个扩展,而是一直在推进它自己的 MNG 动图格式。MNG 格式过于复杂以至于并没有什么系统或浏览器支持,而 APNG 格式由于简单容易实现,目前已经渐渐流行开来。Mozilla 自己的 Firefox 首先支持了 APNG,随后苹果的 Safari 也开始有了支持, Chrome 目前也已经尝试开始支持 ,可以说未来前景很好。

WebP

是 Google 在 2010 年发布的图片格式,希望以更高的压缩比替代 JPEG。它用 VP8 视频帧内编码作为其算法基础,取得了不错的压缩效果。它支持有损和无损压缩、支持完整的透明通道、也支持多帧动画,并且没有版权问题,是一种非常理想的图片格式。借由 Google 在网络世界的影响力,WebP 在几年的时间内已经得到了广泛的应用。看看你手机里的 App:微博、微信、QQ、淘宝、网易新闻等等,每个 App 里都有 WebP 的身影。Facebook 则更进一步,用 WebP 来显示聊天界面的贴纸动画。

BPG(Better Portable Graphics)

是著名程序员 Fabrice Bellard 在2014年发布的一款超高压缩比的图片格式。这个程序员有些人可能感觉面生,但说起他的作品 FFmpeg、QEMU 大家想必是都知道的。BPG 使用 HEVC (即 H.265) 帧内编码作为其算法基础,就这点而言,它毋庸置疑是当下最为先进的图片压缩格式。相对于 JP2、JPEG-XR、WebP 来说,同等体积下 BPG 能提供更高的图像质量。另外,得益于它本身基于视频编码算法的特性,它能以非常小的文件体积保存多帧动画。 Fabrice Bellard 聪明的地方在于,他知道自己一个人无法得到各大浏览器厂商的支持,所以他还特地开发了 Javascript 版的解码器,任何浏览器只要加载了这个 76KB 大小的 JS 文件,就可以直接显示 BPG 格式的图片了。目前阻碍它流行的原因就是 HEVC 的版权问题和它较长的编码解码时间。尽管这个图片格式才刚刚发布一年,但已经有不少厂子开始试用了,比如阿里和腾讯。
(可以参考这个知乎讨论https://www.zhihu.com/question/27089508)

本专题主要讲jpeg,png和webp三种格式对应压缩库的使用,并对他们的编码性能表现做一些对比。
接下来的文章会分别讲一下libjpeg-turbo、libpng、libwebp三种库的基本使用方法。所有的代码都是Android NDK开发的实现样例。

参考资料:
移动端图片格式调研
Android bitmap(二) 常见图片格式JPG PNG
What’s the Difference Between JPG, PNG, and GIF?

你可能感兴趣的:(Android)