文档详情

该b源代码b包含有6个文件.doc

发布:2017-09-26约字共10页下载文档
文本预览下载声明
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; //假如是第一个节点,
显示全部
相似文档