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的libjpeg-turbo警告该存储库已被取代该存储库为提供了一个有效的Android.mk构建配置,这意味着您将能够使用ndk-build应用程序, ndk-build工具链骗局。 只需将此存储库添加为Git子模块,就可以了。 ...
可以用于Android平台的libjpeg库!可以用于Android平台的libjpeg库!可以用于Android平台的libjpeg库!重要的事情说三遍。
libjpeg移植生成的库在此类应用 此库只包含解压部分。 位图解析 理论验证
libjpeg移植资料含说明-gec6818818开发板jpg格式图片显示
将 jpegsr9移植到vc环境下,其中把解压部分提练出来了。压缩部分虽然没有去验证,但也分拣出来了,相信和解压部分移植差不多。 解压部分,编成了lib文件夹。供我analyzeBmp工程调用,后续也会上传。验证通过。
Libjpeg demo(AndroidStudio)
Android 64位 libjpeg.a下载
libjpeg-turbo 最新android 端 包含 主流cpu架构编译脚本 源码
纯C语言+libjpeg实现最简单jpeg图片解码显示程序
ubuntu安装inode3.6时需要,这个希望对广大朋友有所帮助
可以用于Android下使用libjpeg。内部有arm x86 x64的静态库和头文件
开源库ImageCompress中使用的so文件(armeabi-v7a版本)包括:libjpeg-turbo的so和使用工具的so文件。
安卓的libjpeg-turbo动态库,包含32位版本,csdn上其他人都要3分,没分了,所以自己编译了下
android ndk 方式使用libjpeg,测试可用。
Android Studio cmake方式jni开发,在c层使用其它动态链接库*.so
开源库ImageCompress中使用的so文件(arm64-v8a版本)包括:libjpeg-turbo的so和使用工具的so文件。
PyTurboJPEG libjpeg-turbo的Python包装器,用于解码和编码JPEG图像。先决条件例子import cv2from turbojpeg import TurboJPEG , TJPF_GRAY , TJSAMP_GRAY , TJFLAG_PROGRESSIVE# specifying library path ...
程序员需要经常刷题吗
官方下载的:libjpeg-turbo-1.5.1 已经使用Cmake编译,并使用VS2015生成x86、x64 分别对应的debug和release版本。