jpeg文件解码器类使用说明
本解码器类支持普通jpeg文件格式,这也是目前大多数jpeg文件所采用的格式,此格式主要特点是数
据精度为8位,采用Huffman编码的普通DCT帧(不支持扩展串行和递进模式及数学编码)。本解码器类的
IDCT算法采用三种模式,分别是浮点解码、定点整数解码和定点整数MMX优化解码,您可根据具体情况选择。
1.使用授权
本原代码文档包括下列文件:
cjpeg.cpp 解码器类原程序
idct.cpp 解码器类原程序,idct解码函数
cjpeg.h 解码器类头文件
jpeg.pdf jpeg文件格式说明
jpeg.txt jpeg文件格式说明
readme.txt 自述文件
showjpeg.exe 使用本原代码的例子程序
showjpeg.cpp 例子程序原文件
如果您要在各种媒体刊载、引用本文档,请不要对本文档内容进行任何修改。如果您在自己的编程中
引用本文档内容,可对引用内容进行修改。作为学习和交流目的,本文档的使用是免费的,如果您直接或
间接将本文档用于商业用途,请在使用前与我联系,获得同意后方可使用。在您引用本文档时如能注明出
处,并通过下面方式通知本人一下,本人将非常高兴!
您在最终使用时请到下面网址再下载一次,以便保证版本最新!对于jpeg格式更多特性的支持将不断
完善。如果您发现错误,请通过下面地址通知我一下。
联系方式:
e-mail:cproom@163.net
http://cproom.yeah.net
通讯地址:陕西省西安市太白南路202号(骊山微电子公司)陈鹏(收)
邮编 :710065
电话 :(029)-8234582
2.jpeg文件解码器类参考
(1)结构类型说明
typedef struct //图象数据的分量参数(分量指色彩通道)
{ UINT v,h; //此分量的垂直和水平方向的采样要素
UINT qtID; //此分量使用的量化表ID
}COMPONENT;
typedef struct //图象数据参数结构
{ UINT imgWidth,imgHeight;//图象的宽和高
UINT bufWidth,bufHeight;//图象数据缓冲区的宽和高
//数据缓冲区的宽和高一定是8或16的整数倍,所以与
//图象的宽和高不一定一样,图象总是位于数据缓冲区
//的左上角,这一点一定要注意!
int comNum; //图象分量数,单色灰度图象为1,RGB彩色图象为3
BYTE *image[5]; //包含图象数据的缓冲区指针,实际包含数据的单元为
//image[0]--image[comNum-1]
}JPEG_IMAGE_INFO;
(2)公有数据成员
无!
(3)私有数据成员
BOOL error; //内部错误标志
UINT errorCode; //内部错误号(未完善)
BOOL opened; //内部状态标志
UINT imgWidth,imgHeight; //图象的宽和高
UINT bufWidth,bufHeight; //图象数据缓冲区的宽和高
UINT numOfCOM; //图象分量数
UINT ri; //重新开始间隔
UINT qt[4][64]; //量化表
CHuffmanTable htDC[4]; //用于DC解码的Huffman表
CHuffmanTable htAC[4]; //用于AC解码的Huffman表
COMPONENT com[6]; //分量参数结构数组
UINT maxH,maxV; //最大水平和垂直采样要素
UINT unitNumH,unitNumV; //水平和垂直方向的单元数
BYTE *image[5]; //包含图象数据的缓冲区指针,实际包含数据的单元为
//image[0]--image[comNum-1]
void (CJpeg::* pIdctFunc)(short*,BYTE*);
//指向IDCT解码函数的指针
(4)私有成员函数
void init();
功能 :对数据成员初始化
参数 :无
返回值:无
void idctFloat(short* coef_block,BYTE *output_buf);
功能 :通过浮点运算进行IDCT解码
参数 :coef:通过Huffman解码和量化后的系数块
output_buf:输出缓冲区
返回值:无
void idctInt (short* coef_block,BYTE *output_buf);
功能 :通过定点整数运算进行IDCT解码
参数 :coef:通过Huffman解码和量化后的系数块
output_buf:输出缓冲区
返回值:无
void domidct8x8llmW(short *inptr,int*,BYTE* outptr);
功能 :通过定点整数运算进行IDCT解码,MMX优化
参数 :inptr:通过Huffman解码和量化后的系数块
output_buf:输出缓冲区
返回值:无
void idctMMX(short* coef_block,BYTE *output_buf);
功能 :通过定点整数运算进行IDCT解码,MMX优化,内部调用domidct8x8llmW()
参数 :coef:通过Huffman解码和量化后的系数块
output_buf:输出缓冲区
返回值:无
void storeBlock(UINT comID,UINT num,BYTE *block,BYTE *img);
功能 :将解码后的数据存入图象缓冲区,待进一步处理
参数 :comID:所存数据所属的分量号
num:所存数据是本分量的第几块数据
block:所存数据缓冲区
img:输出到的图象缓冲区
返回值:无
void YCbCrToRGB();
功能 :将图象缓冲区由YCbCr格式转换为RGB格式
参数 :无
返回值:无
BOOL readQTable(ifstream &ifs);
功能 :从文件流中读取量化表信息
参数 :ifs:用于读取数据的文件流引用
返回值:成功返回TRUE,失败返回FALSE
BOOL readHTable(ifstream &ifs);
功能 :从文件流中读取Huffman表
参数 :ifs:用于读取数据的文件流引用
返回值:成功返回TRUE,失败返回FALSE
BOOL readSOF0(ifstream &ifs);
功能 :从文件流中读取SOF0段
参数 :ifs:用于读取数据的文件流引用
返回值:成功返回TRUE,失败返回FALSE
BOOL readRI(ifstream &ifs);
功能 :从文件流中读取重新开始标志段
参数 :ifs:用于读取数据的文件流引用
返回值:成功返回TRUE,失败返回FALSE
BOOL readSOS(ifstream &ifs);
功能 :从文件流中读取SOS段,包括后面的数据
参数 :ifs:用于读取数据的文件流引用
返回值:成功返回TRUE,失败返回FALSE
(5)公有成员函数
CJpeg();
功能 :构造函数,构造一个空对象,以后用open()函数打开文件
参数 :无
返回值:无
说 明:内部调用init()函数
CJpeg(LPCSTR fileName,UINT idctMode);
功能 :构造函数,构造一个对象并同时打开一个文件
参数 :fileName:要打开的jpeg图象文件名
idctMode:IDCT解码模式(IDCT_FLOAT,IDCT_INT,IDCT_MMX)
返回值:无
说 明:内部调用open()函数,参看open()函数
~CJpeg();
功能 :析构函数
参数 :无
返回值:无
说 明:内部调用close()函数
BOOL operator!();
功能 :判断构造是否成功
参数 :无
返回值:为真则构造成功,为假则失败。
说 明:在构造函数调用之后,一定要调用此函数确定构造是否成功。
BOOL open(LPCSTR fileName,UINT idctMode);
功能 :打开文件
参数 :fileName:要打开的jpeg图象文件名
idctMode:IDCT解码模式(IDCT_FLOAT,IDCT_INT,IDCT_MMX)
返回值:成功返回TRUE,失败返回FALSE
说 明:IDCT_FLOAT 浮点解码 (速度29,质量优秀)
IDCT_INT 定点整数解码 (速度21,质量好)
IDCT_MMX 定点整数MMX优化解码 (速度17,质量良)
以上数据仅供参考,其实图象质量基本看不出差别
void getImageInfo(JPEG_IMAGE_INFO* info);
功能 :取得图象信息用于显示
参数 :info:指向图象信息结构的指针
返回值:无
说 明:无
void close();
功能 :将状态有打开切换到关闭,以便打开新的文件
参数 :无
返回值:无
说 明:释放内存,可以再次用open()打开新的文件。
UINT getLastError();
功能 :取得最后一次成员函数调用后的错误代码
参数 :无
返回值:错误代码
说 明:初步可用,不完善
3.jpeg类用到的Huffman树类参考
本Huffman树类是用于jpeg类的特殊情况,不具有通用性。
(1)结构类型说明
typedef struct NODE //Huffman树的节点结构
{ NODE *lNode; //指向左节点的指针
NODE *rNode; //指向右节点的指针
BOOL isLeave; //是否是叶子节点
unsigned char code; //编码所代表的值
}NODE;
typedef struct //内部使用,过于具体,无介绍必要
{ unsigned char *stream;
UINT bufIdx;
UINT bitIdx;
UINT remain;
}DECODE_PARAM;
(2)公有数据成员
无
(3)私有数据成员
NODE root; //根节点
(4)私有成员函数
无
(5)公有成员函数
CHuffmanTable();
功能 :构造函数
参数 :无
返回值:无
说 明:无
~CHuffmanTable();
功能 :析构函数
参数 :无
返回值:无
说 明:释放内存
BOOL addNode(UINT len,unsigned char c);
功能 :加入节点
参数 :len:加入的节点所表示的Huffman码长度
c:Huffman码所代表的值
返回值:成功返回TRUE,失败返回FALSE
说 明:递归调用addNode(NODE* node,UINT len,unsigned char c)
BOOL addNode(NODE* node,UINT len,unsigned char c);
功能 :加入节点
参数 :node:当前节点
len:剩余位长度
c:Huffman码所代表的值
返回值:成功返回TRUE,失败返回FALSE
说 明:递归函数
void clear();
功能 :释放Huffman树所占内存
参数 :无
返回值:无
说 明:递归调用clearNode(NODE* node),被CJpeg类的close()函数调用
void clearNode(NODE* node);
功能 :释放当前节点及其子节点所占内存
参数 :node:当前节点
返回值:无
说 明:递归函数
BOOL deCode(DECODE_PARAM* pa,unsigned char *p);
功能 :Huffman解码
参数 :pa:解码数据流参数
p:用于存放返回的编码值的unsigned char型数据指针
返回值:成功返回TRUE,失败返回FALSE
说 明:无
4.gifinfo.exe使用说明
功能:依次循环显示所在目录下