该b源代码b包含有6个文件.doc
文本预览下载声明
EZW举例
该源代码包含有6个文件:
EZW.H - EZW编码器头文件
EZW.C - EZW编码器文件
MATRIX2D.H MATRIX2D.C - 编码器数据结果定义和数据操作
FIFO.H FIFO.C - 扫描方式定义:先入先出原则
LIST.H LIST.C - 零树结构定义和操作
UNEZW.C - EZW解码器
这里,读者重点要掌握的是EZW.C和LIST.C中的内容,充分理解零树的概念。
--------------
EZW编码器
#define debug
#include ezw.h
#include fifo.h
#include list.h
#include matrix2d.h
#include stdio.h
#include stdlib.h
#include math.h
//工作矩阵matrix_2d *M;
//误差值char error;
//用于统计某一数据流中1和0的个数int zeroes, ones;
//编码数据流的输出文件FILE *ezw_file;
//输出字节及编码标志位unsigned char output_byte, mask;
//建立一个数据流输出的文件头ezw_file_header header;
void load_data(matrix_2d *m)
{ int row, col;
for (row=0; row8; row++)
{for (col=0; col8; col++)
{//进行工作矩阵的赋值m-m[row][col] = example[row][col];
}}}
/* * Puts a bit in the output stream.*/
void put_bit(char bit)
{//如果放入的比特为是1,统计1的个数;反之统计0的个数
if (bit==1)
{output_byte |= mask;
ones++;}
else zeroes++; mask = 1;
if (mask==0)
{fwrite(output_byte,sizeof(output_byte),1,ezw_file);
output_byte = 0; mask = 0x80; }}
/* * Puts dominant-pass and subordinate-pass codes in the output stream. */
void output_code(int code)
{//对于一个已经量化且编码后的数据,来判断它的类型。其类型有6种,正如在头文件中定义的那样
switch (code)
{case ZERO:
put_bit(0); //如果是二进制数0,则输出一个比特位,值不变
#ifdef debug printf(0);
#endif break;
case ONE:
put_bit(1); //如果是二进制数1, 则输出一个比特位,值不变
#ifdef debug printf(1);
#endif break;
case POS:
put_bit(0); //如果是正大系数,则按顺序输出两个比特位,值依次为0,1
put_bit(1);
#ifdef debug printf(p); #endif
break;
case NEG:
put_bit(1); //如果是负大系数,则按顺序输出两个比特位,值依次为1,1
put_bit(1);
#ifdef debug printf(n); #endif break;
case ZTR:
put_bit(0); //如果是零树根,则按顺序输出两个比特位,值依次为0,0
put_bit(0);#ifdef debug
printf(t);
#endif
break;
case IZ:
put_bit(1); //如果是孤独零,则按顺序输出两个比特位,值依次为1,0
put_bit(0);
#ifdef debug printf(z); #endif break; }}
/* * Returns the largest value in a descendance tree. */
element_type max_descendant(matrix_2d *m, int x, int y)
{ int i, j, min_x, max_x, min_y, max_y;
//max为函数输出值 element_type temp, max;
//假如是第一个节点,
显示全部