利用游程编码实现二值图像压缩Word文档格式.docx
- 文档编号:13257773
- 上传时间:2022-10-09
- 格式:DOCX
- 页数:15
- 大小:25.21KB
利用游程编码实现二值图像压缩Word文档格式.docx
《利用游程编码实现二值图像压缩Word文档格式.docx》由会员分享,可在线阅读,更多相关《利用游程编码实现二值图像压缩Word文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
在算术编码中需要注意几个问题:
(1)由于实际计算机的精度不可能无限长,运算中出现溢出是一个明显的问题,但多数及其都有16位,32位或者64位的精度,因此这个问题可以使用比例缩放方法解决。
(2)算术编码器对整个消息只产生一个码字,这个码字是在间隔[0,1)中的一个实数,因此译码器在接受到表示这个实数的所有位之前不能进行译码。
(3)算术编码是一种对错误很敏感的编码方法,如果有一位发生错误就会导致整个消息译错。
算术编码可以是静态的或者是自适应的。
在静态算术编码中,信源符号的概率是固定的。
在自适应算术编码中,信源符号的概率根据编码时符号出现的频率动态地进行修改,在编码期间估算信源符号概率的过程叫做建模。
需要开发动态算术编码的原因是因为事前知道精确的信源概率是很难的,而且不切实际。
当压缩消息时,不能期待一个算术编码器获得最大的效率,所能做的最有效的方法是在编码过程中估算概率。
因此动态建模就成为确定编码器压缩效率的关键。
游程编码(RLE编码——RunLengthEncoding)
游程编码又称“运行长度编码”或“行程编码”,是一种统计编码,该编码属于无损压缩编码。
对于二值图有效。
行程编码的基本原理是:
用一个符号值或串长代替具有相同值的连续符号(连续符号构成了一段连续的“行程”。
行程编码因此而得名),使符号长度少于原始数据的长度。
例如:
21111111
行程编码为:
(5,6)(7,5)(3,3)(2,4)(l,7)。
可见,行程编码的位数远远少于原始字符串的位数。
在对图像数据进行编码时,沿一定方向排列的具有相同灰度值的像素可看成是连续符号,用字串代替这些连续符号,可大幅度减少数据量。
行程编码分为定长行程编码和不定长行程编码两种类型。
行程编码是连续精确的编码,在传输过程中,如果其中一位符号发生错误,即可影响整个编码序列,使行程编码无法还原回原始数据。
游程编码所能获得的压缩比有多大,主要取决于图像本身的特点。
如果图像中具有相同颜色的图像块越大,图像块数目越少,获得的压缩比就越高。
反之,压缩比就越小。
文章出处:
.diybl./course/3_program/c++/cppjs/2008331/107771.html
编码方案设计:
按位进行压缩,对二进制流进行超前扫描,判断是否值得压缩,如果压缩有意义,则压缩;
否则保持原始数据。
系统实现方案:
总体思想:
将图像文件以二进制方式读入缓冲区,把二进制位转制为整数,对缓冲区数据进行编码,以特定的格式(unsignedshort)写入输出文件;
解压缩过程反过来即可。
压缩文件存储格式:
以每两个字节为单位储存(即每次写入16位unsignedshort类型)。
012~15
...
第0位 存储压缩信息(1压缩;
0不压缩,原始数据)
第1位 如果第0位为1(压缩),此位标明字符类别(0或1);
如果第0位为0(原始数据),此位无意义,默认为0
后14位 存储字符数量或者原始数据的值
算法实现:
缓冲区:
定义缓冲区为一维char数组,因为只用14位来统计数量,所以缓冲区总字符量即维数应小于或等于214(16384)。
判断可压缩性:
对当前指针位置,超前扫描16位,如果这16位全相同(例:
111或000),那么可压缩性为真,从当前位置开始计数并指针前移,直到相同序列终止或到达缓冲区边界为止。
将统计数量写入unsignedshort类型后14位,第0位置1,第0位置为当前字符;
如果16位中有不相同数据(例:
011)或缓冲区中有效数据不足16位,那么可压缩性为假,从当前位置开始读14位(如果缓冲区中剩余不足14位,有多少位读多少位)。
把原始数位写入unsingedshort类型后14位,前两位置0。
解压缩:
每次从压缩文件读取16位到short类型,根据第0位和第1位的数值进行相应的解码处理,直到缓冲区满,每次从缓冲区中取8位,写入文件。
源码(gcc或C++编译器)。
Bmpheader.h
typedefunsignedcharBYTE;
typedefunsignedshortWORD;
typedefunsignedlongDWORD;
typedeflongLONG;
typedefstruct
...{
/**//*BITMAPFILEHEADER*/
BYTEbfType[2];
//位图文件的类型,必须为BM
DWORDbfSize;
//位图文件的大小,以字节为单位
WORDbfReserved1;
//位图文件保留字,必须为
WORDbfReserved2;
DWORDbfOffBits;
//位图数据的起始位置,以相对于位图文件头的偏移量表示,以字节为单位
/**//*BITMAPINFOHEADER*/
DWORDBiSize;
//本结构所占用字节数
LONGBiWidth;
//位图的宽度,以像素为单位
LONGBiHeight;
//位图的高度,以像素为单位
WORDBiPlanes;
//目标设备的级别,必须为
WORDBiBitCount;
//每个像素所需的位数,必须是
DWORDBiCompression;
//位图压缩类型,必须是0(不压缩),1(BI_RLE8压缩类型)或(BI_RLE4压缩类型)之一
DWORDBiSizeImage;
//位图的大小,以字节为单位
LONGBiXpelsPerMeter;
//位图水平分辨率,每米像素数
LONGBiYpelsPerMeter;
//位图垂直分辨率,每米像素数
DWORDBiClrUsed;
//位图实际使用的颜色表中的颜色数
DWORDBiClrImportant;
//位图显示过程中重要的颜色数
}BITMAPHEADER;
/**//*************颜色表**************/
typedefstruct
...{
unsignedcharblue;
//蓝色的亮度(值围为-255)
unsignedchargreen;
unsignedcharred;
charreserved;
//保留,必须为
}RGBQUAD;
/**//*********压缩字符流结点**********/
Main.cpp
/**//*黑白点二值位图游程编码压缩程序*/
/**//*2008.3.20
作者:
付闯 */
#include<
stdio.h>
stdlib.h>
conio.h>
string.h>
#include"
bmpheader.h"
constunsignedshortMaxSize=16384;
//14字节最大数
voidcompress(FILE*,FILE*);
//压缩
voiddecompress(FILE*,FILE*);
//解压缩
voidwbuffer(FILE*,char*,int);
/**//*将像素信息写入缓冲区*/
voidbuf_init(char*,int);
//缓冲初始化
voidrbuffer(FILE*,char*,int);
//读缓冲到文件
unsignedlongRLE(FILE*,char*,int,unsignedlong);
//游程压缩,并返回写入字节数
voiddecode(FILE*,char*,int);
//解码,逆运算
//voidbufdisplay(char*,char*,int);
//打印缓冲,测试用
DWORDgetBMPsize(FILE*ifp);
//获取位图大小
intIsFeasible(char*,char*,int);
//判断压缩可行性,可行
intmain()
...{
FILE*ifp,*ofp,*ffp;
charchoic;
char*ifilename,*ofilename;
ifilename=(char*)malloc
(1);
ofilename=(char*)malloc
(1);
printf("
a.压缩b.解压缩"
);
choic=getch();
if(choic=='
'
a'
)
请输入压缩(Compress)源文件名:
"
scanf("
%s"
ifilename);
请输入压缩(Compress)输出文件名:
ofilename);
if((ifp=fopen(ifilename,"
rb"
))==NULL)
无法打开文件!
getch();
return1;
}
if((ofp=fopen(ofilename,"
wb"
无法创建文件!
compress(ifp,ofp);
文件%s成功压缩为文件%s"
ifilename,ofilename);
fclose(ifp);
fclose(ofp);
else
请输入解压缩(Decompress)源文件名:
请输入解压缩(Decompress)输出文件名:
if((ofp=fopen(ifilename,"
if((ffp=fopen(ofilename,"
decompress(ofp,ffp);
文件%s成功解压缩为文件%s!
ifilen
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 利用 游程 编码 实现 图像 压缩
![提示](https://static.bdocx.com/images/bang_tan.gif)