使用IJG读写JPEG格式文件
作者: ysm 日期: 2009年10月27日发表评论 (0)查看评论
ysm
cleverysm@gmail
IJG全称为Independent JPEG Group,是一个用于处理JPEG文件格式的开源库。用于遥感和地理信息系统数据处理的GDAL就是用这个库进行JPEG格式解析的。
IJG的主页是/,源代码和一些相关文档可以在/files/下到。
本文中将依据文档中的libjpeg.doc介绍一些基本的JPEG文件解压缩和压缩处理方式,细节及其他高级操作可以参考libjpeg.doc中的具体介绍。
编译
编译需要的源代码包下载链接是/files/jpegsrc.,下载到硬盘上解压,比如我们将其解压到C:\jpeg-6b,在文件夹中有几个*.doc的文件,是IJG的安装使用文档,比如install.doc就是安装
的说明书。虽然这几个文件是以doc为扩展名,其实只是几个文本文件,用记事本之类的程序也可以打开。Libjpeg.doc则是在你的程序中使用IJG库进行开发的使用说明。另外还有个example.c文件是一个示例代码文件,里面有使用IJG进行JPEG读写的样本代码,以及关于每段代码的详细解释,基本上来说,在实际应用时直接按照example.c的代码框架进行修改就基本能满足我们应用程序的需要。
IJG支持多平台下的应用,不同平台下的编译安装细节都可以在install.doc中到。在此,我以MS VC 2005为例进行说明。
在windows下使用的时候需要对源代码做几处修改。
在头文件jmorecfg.h中到如下代码:
#ifndef XMD_H /* ysm fixed*/
#ifndef _BASETSD_H_
typedef long INT32;
#endif
#endif
开始编译前需要首先将jconfig.vc更名为jconfig.h,然后在命令行下进入到VC2005的安装目录下,比如在我的机器上是C:\Program Files\Microsoft Visual Studio 8\VC,在bin目录下有一个名为vcvars32.bat的批处理文件,在命令行下运行这个批处理,这个批处理的作用是注册VC2005相关的一些环境变量,然后不要关闭当前命令窗口,进入到IJG的安装目录,在此即C:\jpeg-6b 下,执行命令nmake /f makefile.vc,也就是开始编译IJG库,在屏幕迅速闪过一些编译信息后,如果没有错误出现,IJG也就编
译完成。编译过程中会可能会出现一些警告信息,大概就是说代码中使用的标准C函数在VC2005下被认为是不安全而过时的,不过没什么大关系,忽略就行,这个警告在用VC6编译的时候就不会出现。
编译完成后,IJG的安装目录下会出现若干文件,我们所需要的是一个叫做libjpeg.lib的静态库文件,在编译我们程序的时候链接使用。除此一般还要用到4个头文件,jconfig.h、jerror.h、jmorecfg.h、jpeglib.h。当然,目录下还会有一些可执行文件,是IJG提供的工具程序,在usage.doc 中有使用方法的介绍。但对程序员来说,最重要的还是4个头文件加一个库文件,以后用IJG
开发的时候用这几个文件就足够了。
define的基本用法开发环境配置
在VC2005下使用IJG之前,首先要让VC能够到那四个头文件,比如说将它们拷到使用IJG 的项目当前目录下,系统的头文件目录下,或者在VC环境下做一下配置,也就是在菜单工具-选项-项目和解决方案-VC++目录下,将头文件和lib文件所在的目录分别添加到包含文件和库文件的列表中。
[图1]
在程序中需要引入的头文件就是jpeglib.h,由于IJG是用C语言写的,所以在C++引入这个头文件就需要使用extern “C”,如下所示:
而lib文件的引入则需要在项目的属性页下的配置属性-链接器-输入-附加依赖项中添加libjpeg.lib。
[图2]
1.为JPEG对象分配空间并初始化
2.指定解压缩数据源
3.获取文件信息
4.为解压缩设定参数,包括图像大小,颜空间
5.开始解压缩
6.取出数据
7.解压缩完毕
8.释放资源
为JPEG对象分配空间并初始化
解压缩过程中使用的JPEG对象是一个jpeg_decompress_struct的结构体。同时还需要定义一个用于错误处理的结构体对象,IJG中标准的错误结构体是jpeg_error_mgr。
也可以设定输出图像的彩空间,即cinfo.out_color_space,可以把一个原本彩的图像由真彩JCS_RGB变为灰度JCS_GRAYSCALE。如:
(void) jpeg_start_decompress(&cinfo);
在完成解压缩操作后,IJG就会将解压后的图像信息填充至cinfo结构中。比如,输出图像宽度cinfo.output_width,输出图像高度cinfo.output_height,每个像素中的颜通道数
cinfo.output_components(比如灰度为1,全彩为3)等。
一般情况下,这些参数是在jpeg_start_decompress后才被填充到cinfo中的,如果希望在调用jpeg_start_decompress之前就获得这些参数,可以通过调用jpeg_calc_output_dimensions()的方法来实现。
取出数据
解开的数据是按照行取出的,数据像素按照scanline来存储,scanline是从左到右,从上到下的顺序,每个像素对应的各颜或灰度通道数据是依次存储,比如一个24-bitRGB真彩的图像中,一个scanline中的数据存储模式是R,G,B,R,G,B,R,G,B,…,每条scanline是一个JSAMPLE类型的数组,一般来说就是unsigned char,定义于jmorecfg.h中。
除了JSAMPLE,IJG还定义了JSAMPROW和JSAMPARRAY,分别表示一行JSAMPLE和一个2D 的JSAMPLE数组。
在此,我们定义一个JSAMPARRAY类型的缓冲区变量来存放图像数据。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。