现在的位置: 首页 > 综合 > 正文

Android原生(Native)C开发之七:libjpeg移植笔记

2013年09月13日 ⁄ 综合 ⁄ 共 2112字 ⁄ 字号 评论关闭

转自: http://blog.sina.com.cn/s/blog_4a0a39c30100ckzd.html



JPEG是Joint Photographic Experts Group(联合图像专家组)的缩写,文件后辍名为".jpg"或".jpeg",是网上比较常见的图像文件格式,以小尺寸著称,但其最大的缺点是它是一种有损压缩的图像格式,能够将图像压缩在很小的储存空间,图像中重复或不重要的资料会被丢失,因此容易造成图像数据的损伤。尤其是使用过高的压缩比例,将使最终解压缩后恢复的图像质量明显降低,如果追求高品质图像,不宜采用过高压缩比例。但是JPEG压缩技术十分先进,它用有损压缩方式去除冗余的图像数据,在获得极高的压缩率的同时能展现十分丰富生动的图像,换句话说,就是可以用最少的磁盘空间得到较好的图像品质。

JPEG2000作为JPEG的升级版,其压缩率比JPEG高约30%左右,同时支持有损和无损压缩。JPEG2000格式有一个极其重要的特征在于它能实现渐进传输,即先传输图像的轮廓,然后逐步传输数据,不断提高图像质量,让图像由朦胧到清晰显示。此外,JPEG2000还支持所谓的"感兴趣区域" 特性,可以任意指定影像上感兴趣区域的压缩质量,还可以选择指定的部分先解压缩。

本文只讨论JPEG的编码及解码,不包括JPEG2000,如果大家兴趣,可以网上找一些资料。

JPEG官方网站(http://www.jpeg.org)并不负责JPEG文件编码及解码的实现,只是制定标准,呵呵,应了那句话:一流的厂商订标准。JPEG的源码请从IJG(Independent JPEG Group,独立JPEG小组)的网站:http://www.ijg.org/下载,如果是支持tar及gz格式的下:
http://www.ijg.org/files/jpegsrc.v6b.tar.gz
如果是Windows请下Zip格式:
ftp://ftp.simtel.net/pub/simtelnet/msdos/graphics/jpegsr6.zip

下完后,解压之,得一目录:jpeg-6b,参见目录下的文件 jversion.h,发现JPEG库的版本是:6b 27-Mar-1998,可见此库是多么的古老与稳定,10多年前的东西了!

下完解完之后第一步,老规矩,先改makefile,将makefile.ansi复制一份,改名为 makefile,并改动如下行:
#09:CC= arm-none-linux-gnueabi-gcc
将gcc编译器改成 android arm的。
#12:CFLAGS= -O2
优化代码,据说 -O2(注意是字母“O”,不是数字“0”)在尺寸及效率上比较好。
#17:LDFLAGS= -s -static
Android Native必加链接参数 -static,-s 是将小库尺寸,去除调试信息。
#33:AR= arm-none-linux-gnueabi-ar rc
#35:AR2= arm-none-linux-gnueabi-ranlib
将AR及AR2库打包程序换成Android Native的。

试下在Cygwin下输入:make
呵呵,太心急了,得到提示如下:
You must prepare a system-dependent jconfig.h file.
Please read the installation directions in install.doc.

就是说 jconfig.h 不存在,我们要准备一个才能编译。找了一遍没打到适合Unix/Linux的,就直接打开 jconfig.doc,将所有内容copy出来,存成了 jconfig.h,因为里面的很详细的宏定义介绍。当然你可以将所有的宏定义都打开,再一个一个试,哪个出了问题就取消哪个。

再输入:make
一切OK,得到了库文件:libjpeg.a及 Andorid Native 可执行文件:cjpeg, djpeg, jpegtran, rdjpgcom, wrjpgcom。看名字就知道cjpeg应该就是一个jpeg文件的compressor(压缩器),将其他文件压缩成jpeg格式,djpeg肯定就是解压缩的了,传到 Android Emulator试下!
(其中“>”为普通命令提示符,“#”为模拟器命令提示符)
>adb push cjpeg /dev/sample/cjpeg
>adb push testimg.bmp /dev/sample/testimg.bmp
>adb shell
#cd /dev/sample
#chmod 777 cjpeg
#./cjpeg -quality 90 -outfile testimg.jpg testimg.bmp
#exit
>adb pull /dev/sample/testimg.jpg testimg.jpg

将cjpeg及测试图片 testimg.bmp push到模拟器,再执行cjpeg得到压缩图片 testimg.jpg,发现高质量(quality = 90)jpg格式图片的大小是bmp格式图片的 25%左右。有兴趣的朋友也可以试下djpeg及其他测试程序。
如下是通过 Android 模拟器压缩出来的jpg文件。
Android原生(Native)C开发之七:libjpeg移植笔记

抱歉!评论已关闭.