编码方案设计:
按位进行压缩,对二进制流进行超前扫描,判断是否值得压缩,如果压缩有意义,则压缩;否则保持原始数据。
系统实现方案:
总体思想:将图像文件以二进制方式读入缓冲区,把二进制位转制为整数,对缓冲区数据进行编码,以特定的格式(unsigned short)写入输出文件;解压缩过程反过来即可。
压缩文件存储格式:
以每两个字节为单位储存(即每次写入16位unsigned short类型)。
0 1 2~15
按位进行压缩,对二进制流进行超前扫描,判断是否值得压缩,如果压缩有意义,则压缩;否则保持原始数据。
系统实现方案:
总体思想:将图像文件以二进制方式读入缓冲区,把二进制位转制为整数,对缓冲区数据进行编码,以特定的格式(unsigned short)写入输出文件;解压缩过程反过来即可。
压缩文件存储格式:
以每两个字节为单位储存(即每次写入16位unsigned short类型)。
0 1 2~15
...
第0位 存储压缩信息(1压缩;0不压缩,原始数据)
第1位 如果第0位为1(压缩),此位标明字符类别(0或1);如果第0位为0(原始数据),此位无意义,默认为0
后14位 存储字符数量或者原始数据的值
算法实现:
缓冲区:定义缓冲区为一维char数组,因为只用14位来统计数量,所以缓冲区总字符量即维数应小于或等于2 14(16384)。
判断可压缩性:对当前指针位置,超前扫描16位,如果这16位全相同(例:11111111111111或00000000000000),那么可压缩性为真,从当前位置开始计数并指针前移,直到相同序列终止或到达缓冲区边界为止。将统计数量写入unsigned short类型后14位,第0位置1,第0位置为当前字符;如果16位中有不相同数据(例:11111101111011)或缓冲区中有效数据不足16位,那么可压缩性为假,从当前位置开始读14位(如果缓冲区中剩余不足14位,有多少位读多少位)。把原始数位写入unsinged short类型后14位,前两位置0。
解压缩:每次从压缩文件读取16位到short类型,根据第0位和第1位的数值进行相应的解码处理,直到缓冲区满,每次从缓冲区中取8位,写入文件。
源码(gcc或C++编译器)。
第0位 存储压缩信息(1压缩;0不压缩,原始数据)
第1位 如果第0位为1(压缩),此位标明字符类别(0或1);如果第0位为0(原始数据),此位无意义,默认为0
后14位 存储字符数量或者原始数据的值
算法实现:
缓冲区:定义缓冲区为一维char数组,因为只用14位来统计数量,所以缓冲区总字符量即维数应小于或等于2 14(16384)。
判断可压缩性:对当前指针位置,超前扫描16位,如果这16位全相同(例:11111111111111或00000000000000),那么可压缩性为真,从当前位置开始计数并指针前移,直到相同序列终止或到达缓冲区边界为止。将统计数量写入unsigned short类型后14位,第0位置1,第0位置为当前字符;如果16位中有不相同数据(例:11111101111011)或缓冲区中有效数据不足16位,那么可压缩性为假,从当前位置开始读14位(如果缓冲区中剩余不足14位,有多少位读多少位)。把原始数位写入unsinged short类型后14位,前两位置0。
解压缩:每次从压缩文件读取16位到short类型,根据第0位和第1位的数值进行相应的解码处理,直到缓冲区满,每次从缓冲区中取8位,写入文件。
源码(gcc或C++编译器)。
Bmpheader.h
typedef unsigned
char
BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;
typedef long LONG;
typedef struct
... {
/**//* BITMAPFILEHEADER*/
BYTE bfType[2];// 位图文件的类型,必须为BM
DWORD bfSize;//位图文件的大小,以字节为单位
WORD bfReserved1;// 位图文件保留字,必须为
WORD bfReserved2;// 位图文件保留字,必须为
DWORD bfOffBits;// 位图数据的起始位置,以相对于位图文件头的偏移量表示,以字节为单位
/**//* BITMAPINFOHEADER*/
DWORD BiSize;// 本结构所占用字节数
LONG BiWidth;// 位图的宽度,以像素为单位
LONG BiHeight;// 位图的高度,以像素为单位
WORD BiPlanes;// 目标设备的级别,必须为
WORD BiBitCount;//每个像素所需的位数,必须是
DWORD BiCompression;// 位图压缩类型,必须是0(不压缩), 1(BI_RLE8压缩类型)或(BI_RLE4压缩类型)之一
DWORD BiSizeImage;// 位图的大小,以字节为单位
LONG BiXpelsPerMeter;// 位图水平分辨率,每米像素数
LONG BiYpelsPerMeter;// 位图垂直分辨率,每米像素数
DWORD BiClrUsed;// 位图实际使用的颜色表中的颜色数
DWORD BiClrImportant;// 位图显示过程中重要的颜色数
} BITMAPHEADER;
/**/ /*************颜色表**************/
typedef struct
... {
unsigned char blue;// 蓝色的亮度(值范围为-255)
unsigned char green;
unsigned char red;
char reserved;// 保留,必须为
} RGBQUAD;
/**/ /*********压缩字符流结点**********/
typedef unsigned short WORD;
typedef unsigned long DWORD;
typedef long LONG;
typedef struct
... {
/**//* BITMAPFILEHEADER*/
BYTE bfType[2];// 位图文件的类型,必须为BM
DWORD bfSize;//位图文件的大小,以字节为单位
WORD bfReserved1;// 位图文件保留字,必须为
WORD bfReserved2;// 位图文件保留字,必须为
DWORD bfOffBits;// 位图数据的起始位置,以相对于位图文件头的偏移量表示,以字节为单位
/**//* BITMAPINFOHEADER*/
DWORD BiSize;// 本结构所占用字节数
LONG BiWidth;// 位图的宽度,以像素为单位
LONG BiHeight;// 位图的高度,以像素为单位
WORD BiPlanes;// 目标设备的级别,必须为
WORD BiBitCount;//每个像素所需的位数,必须是
DWORD BiCompression;// 位图压缩类型,必须是0(不压缩), 1(BI_RLE8压缩类型)或(BI_RLE4压缩类型)之一
DWORD BiSizeImage;// 位图的大小,以字节为单位
LONG BiXpelsPerMeter;// 位图水平分辨率,每米像素数
LONG BiYpelsPerMeter;// 位图垂直分辨率,每米像素数
DWORD BiClrUsed;// 位图实际使用的颜色表中的颜色数
DWORD BiClrImportant;// 位图显示过程中重要的颜色数
} BITMAPHEADER;
/**/ /*************颜色表**************/
typedef struct
... {
unsigned char blue;// 蓝色的亮度(值范围为-255)
unsigned char green;
unsigned char red;
char reserved;// 保留,必须为
} RGBQUAD;
/**/ /*********压缩字符流结点**********/
Main.cpp
/**/
/*黑白点二值位图游程编码压缩程序*/
/**/ /*2008.3.20
作者:付闯 */
#include < stdio.h >
#include < stdlib.h >
#include < conio.h >
#include < string .h >
#include " bmpheader.h "
const unsigned short MaxSize = 16384 ; // 14字节最大数
void compress(FILE * ,FILE * ); // 压缩
void decompress(FILE * ,FILE * ); // 解压缩
void wbuffer(FILE * , char * , int ); /**/ /*将像素信息写入缓冲区*/
void buf_init( char * , int ); // 缓冲初始化
void rbuffer(FILE * , char * , int ); // 读缓冲到文件
unsigned long RLE(FILE * , char * , int ,unsigned long ); // 游程压缩,并返回写入字节数
void decode(FILE * , char * , int ); // 解码,逆运算
/ / void bufdisplay( char * , char * , int ); // 打印缓冲,测试用
/**/ /*2008.3.20
作者:付闯 */
#include < stdio.h >
#include < stdlib.h >
#include < conio.h >
#include < string .h >
#include " bmpheader.h "
const unsigned short MaxSize = 16384 ; // 14字节最大数
void compress(FILE * ,FILE * ); // 压缩
void decompress(FILE * ,FILE * ); // 解压缩
void wbuffer(FILE * , char * , int ); /**/ /*将像素信息写入缓冲区*/
void buf_init( char * , int ); // 缓冲初始化
void rbuffer(FILE * , char * , int ); // 读缓冲到文件
unsigned long RLE(FILE * , char * , int ,unsigned long ); // 游程压缩,并返回写入字节数
void decode(FILE * , char * , int ); // 解码,逆运算
/ / void bufdisplay( char * , char * , int ); // 打印缓冲,测试用