IJG的全称是Independent JPEG Group(独立JPEG小组),该组织以C语言源代码的形式提供应用广泛、完全免费的JPEG解码/编码函数库,编译后生成二进制格式的LIB文件,可以连接到其他编译型语言的程序中。其实对于Windows程序员来说,这个函数库最难的地方就是对编译选项的设置(Unix无此问题),一旦设置完成,编译成功,差不多就可以卖钱了。有些开发商就是将对IJG的调用封装一下,生成DLL或OCX,就开始堂而皇之地收费。由于IJG生成的代码简洁干净,无需任何DLL或OCX,很多收费的图像浏览器、编辑器等也直接或间接地基于IJG。另外在IJG的源代码中还包含对GIF、BMP、PPM、TGA、RLE文件解码/编码的实例代码,因此也有人说IJG提供的JPEG库支持这些图像格式,其实这些代码仅供IJG测试用,一般生成的LIB文件中并不包括这部分代码,如果想支持这些格式还需要在此源码基础上花功夫。
IJG最大的好处是稳定、兼容性强,毕竟经受了多年的考验。缺点是速度太慢,碰到大文件会很难受。
IJL的全称是Intel® JPEG Library,是由Intel公司提供的JEPG解码/编码库,专门针对Intel处理器进行了彻底的优化,因此在Win-tel环境下速度一流。这个工具最大的特点就是简单,一共只有六个函数(ijlInit、ijlFree、ijlRead、ijlWrite、ijlGetLibVersion、ijlErrorStr),而且随机文档中附有完整的VC++实例,因此对于VC程序员来说不用费什么脑子就可以对JPEG应用自如。
IJL有两个主要的版本:1.5版和2.0版。1.5版是最后一个免费版本的IJL,以后的版本都是收费版。而2.0则是IJL的最后一个版本,以后IJL被Intel ® Integrated Performance Primitives (IPP)v6.1中新推出的UIC(Unified Image Codec)所取代。
免费的IJL v1.5流传很广,但存在下列问题:
内存漏洞。这个用IJL的DLL版看不出,要用Static Lib版才能看出来:每打开一个文件,VC会报告72字节(3通道JPG)或24字节(单通道JPG)的漏洞。网上有文章说明如何用内联汇编解决这个问题。
不支持EXIF中指定的旋转参数。这个问题不大,可以在解码后自己旋转,但需要自己再去解码EXIF。
手册上说不支持CMYK色彩空间,但自带的JPGView例子支持部分CMYK的解码,另外一些解码后色彩不正确。这个也可以修正,同样需要自己解码。
容错性太差。某些数据异常的文件用IJG能解码,用IJL则不行。有源代码的话很容易修正,没有源代码就难了。
IJL v2.0从其他途径可以搞到,包括部分源代码。但是从我试用的情况看,除修正了内存漏洞外,其他问题依旧存在。不过毕竟有一些源代码,所以可以自己动手修正。另外虽然IJL v2.0的编译环境要求是VC++ 2002以上,自己建个project在VC6下编译也没有问题,花几分钟修正一下就好。
从速度上来说,在目前的主流CPU上IJL v2.0要比v1.5快,毕竟可以采用最新的处理器指令。因此从v2.53开始,本软件不再采用IJG,改用IJL v2.0。
在IPP的sample中,也给出了用IPP改造后的IJG版本,速度比原版IJG要快,但还是没有IJL快。