Jpeg是一种常用的压缩图像格式。其编解码过程很复杂,目前大部分软件均采用现成 的Jpeg库, 比如GDI+ 以及 IJG . 前者需要额外的DLL的支持,而且某些情况下性能很成问题,所以IJG仍然是最好的选择之一。
IJG可以去[url]http://www.ijg.org/[/url]获取 . 下载来的是一个源代码压缩包,需要自己编译。这个包里面包含了JpegLib 以及一些实用工具(如CJpeg ,可以把BMP或者DIB转换成JPG,而且支持很多参数,这个程序可以直接改造成一个很有用的组件)。
编译IJG并不是很高深的东西,它本身就附带了一个说明文档。但是这个文档非常长,而且结构令人莫名其妙,废话一大堆 .主要精髓如下:
- 把 jconfig.vc 改名为 jconfig.h
- 把 makelib.ds 改名为 jpeg.mak
- 使用VC++构建jpeg.mak
如果一切顺利的话,可以得到 jpeg.lib 这个静态库文件。这个东东就是IJG的核心,一切与之有关都要链接到该文件。
然后就是CJpeg的编译。CJpeg其实也可以直接使用压缩包中的makefile.vc来构建,不过这样的话生成的文件很大,而且不便于改造。所以把CJpeg单独抠出来,是较好的方式。虽然这也不是很难的事情,但我仍然花了很长时间。主要问题是Cjpeg内部调用了很多外部函数,而这些外部函数又恰好分布在不同的地方. 如果直接把CJpeg.c拿出来,则会出现很多error LNK2001: unresolved external symbol........之类的错误。CSDN上有人问了这个问题,不过那些回复的人极其不负责任,说是什么没有链接jpeg.lib . 其实真正的原因是CJpeg.c还依靠其他的几个源文件。下面就是其所需的所有文件列表:
cjpeg.c
cdjpeg.c
rdbmp.c
rdswitch.c
rdgif.c
rdppm.c
rdtarga.c
jconfig.h
cdjpeg.h
jinclude.h
jpeglib.h
jerror.h
cderror.h
jversion.h
jmorecfg.h
jpeglib.h
建立一个Win32空工程,然后加入以上文件,并在头部加入下面语句以便链接jpeglib
#pragma comment(lib, "jpeg.lib")
即可编译通过。
而Cjpeg可以被改造成很多有用的工具,为我们免去了很多繁杂的工作。可谓是一举两得。
本文转自 kevx 51CTO博客,原文链接:http://blog.51cto.com/spinlock/138289,如需转载请自行联系原作者