如何更快的操作jpeg图片?

如何更快的操作jpeg图片?


收到一个任务,加载jpeg图片时间有点慢,让优化其加载速度。我也仅仅是知道jpg是众多图片格式的一种啊,如何优化呢?挠头中。。。。。。

1. 还是先了解一下jpg格式吧

.jpeg/.jpg是最常用的图像文件格式,由一个软件开发联合会组织制定,是一种有损压缩格式,能够将图像压缩在很小的储存空间,图像中重复或不重要的资料会被丢失,因此容易造成图像数据的损伤。尤其是使用过高的压缩比例,将使最终解压缩后恢复的图像质量明显降低,如果追求高品质图像,不宜采用过高压缩比例。但是JPEG压缩技术十分先进,它用有损压缩方式去除冗余的图像数据,在获得极高的压缩率的同时能展现十分丰富生动的图像,换句话说,就是可以用最少的磁盘空间得到较好的图像品质。

jpeg图片的生成和解析,想必大家都可能会想到libjpeg库,很多地方都是用的这个库来编码和解码jpeg图片的。让优化的这个场景就是用这个库来解析的啊,这个库肯定是很多大牛已经优化的不能再优化了啊,确定还能继续优化?

2. 搜索资料中

一顿狂搜,发现了一些个人开发者写的解析jpeg图片的资料和libjpeg-turbo这个库。

先说一下个人开发者解析jpeg图片的资料,我大概看了一下,绝大部分是基于jpeg库来做的封装;另一部分是自己写的对jpeg的解码。基于jpeg库的封装就不用测了,我们的工程也是基于jpeg做的。自己写对jpeg解码的那部分,我测试了一下,那速度简直惨不忍睹,根本不如使用jpeg库。

说一下libjpeg-turbolibjpeg-turbo是一个JPEG图像编解码器,它使用SIMD指令(MMX、SSE2、AVX2、NEON、AltiVec)来加速在x86、x86-64、ARM和PowerPC系统上对JPEG压缩和解压。在这样的系统中,libjpeg-turbo通常是libjpeg的2-6倍速度。我大概看了一下,它是在编码解码阶段根据处理器的不同用的汇编代码来优化的,果然牛!这个性能比较页面有详细数据。吹的那么好,赶快下载下来试试啊。

下载地址,我当然下载最新的1.5.3版本了。

可能还有人会提到OpenJPEG库,这个是针对JPEG 2000格式的图片的开源库,JPEG和JPEG 2000的差别大家自行搜索一下,总之,“他们不一样~,不一样~”。所以OpenJPEG库是不能用在这里的。

3. 编译和使用libjpeg-turbo

还是交叉编译

./configure --prefix=$PWD/install --host=arm-none-linux-gnueabi
make
make install

具体如何配置请参看configure -h

会在安装目录下生成:bin、include、lib、share

先看下lib目录,生成了libjpeg的动态库和静态库,咦?怎么多了一个libturbojpg库?滚回去仔细看了人家的文档,生成的jpeg库的API是兼容原始的libjpeg库的,那这样工程中解析jpeg那部分的代码就不用动了,直接替换库就可以了,这个简直太好了。多出来的libturbojpg库呢,是人家自己又封装了一层自己的API,可以用,也可以不用,那我就不用了。

bin目录是生成的一些小工具,share是一些文档资料。

4. 测试和进一步的优化

欣喜的替换掉原来的jpeg库,测试了一下加载速度,由原来的平均240ms加快到了160ms,哇,一下优化了80ms。但这个结果对我们来说还是不太满足,还嫌160ms慢。。。

去bin目录下面看看有哪些小工具吧,看到djpeg,文档说这是解析jpeg库的小工具。研究了一下这个工具的使用,带哪些参数选项,试了一下把一张jpg图片转出bmp图片,果然不错。对比了一下,同样是导出一张bmp图片的情况下,带-fast参数和不带-fast参数,时间上果然不一样。但是对比生成的两张bmp图片,说实话肉眼看不出太明显的区别来。那带上-fast可就更快了啊。又滚回去查看djpeg的源码,找到了对于带-fast参数的解析jpg的那块代码,返回来又在我们工程中查看发现竟然没有加速解析的这块代码,加进去重新编译试了一下,160ms竟然提升到了120ms,又缩短了40ms,完美啊。

从一开始的240ms提升到了现在的120ms,速度是原来的2倍。我觉得这种优化已经是到尽头了吧,要想再进一步优化,可能只能对工程中其他部分功能代码做优化了。

如何使用jpeg库生成jpg图片和解析jpg图片,网上资料很多,本文不做描述。

本文仅仅是对如何去解决一个问题的各种步骤的描述,以及学习过程的描述和记录。

其他资料:

[1] JPEG
[2] JPEG官网
[3] libjpeg-turbo
[4] analysis of jpeg decoding speeds
[5] JPEG 2000

猜你喜欢

转载自blog.csdn.net/onlyshi/article/details/81081513