- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
PNG图像格式的压缩算法.doc
PNG图像格式的压缩算法
便携式网络图形(Portable Network Graphics)简称为PNG,它是一种无损压缩的位图图形格式,其含有以下几种特性:
支持256色调色板技术以产生小体积文件
支持最高48位真彩色图像以及16位灰度图像
支持阿尔法通道(Alpha Channel,表示图片的透明度和半透明度)的透明/半透明性
支持图像亮度的伽马校正(Gamma校准,用来针对影片或是影像系统里对于光线的辉度 (luminance) 或是三色刺激值 (tristimulus values)所进行非线性的运算或反运算)信息
使用了无损压缩的算法
使用了循环冗余校验(CRC,用来检测或校验数据传输或者保存后可能出现的错误)防止文件出错
PNG格式的文件结构
PNG定义了两种类型的数据块:一种是PNG文件必须包含、读写软件也都必须要支持的关键块(critical chunk);另一种叫做辅助块(ancillary chunks),PNG允许软件忽略它不认识的附加块。这种基于数据块的设计,允许PNG格式在扩展时仍能保持与旧版本兼容。
关键数据块中有4个标准数据块:
1、文件头数据块IHDR(header chunk):包含有图像基本信息,作为第一个数据块出现并只出现一次。
2、调色板数据块PLTE(palette chunk):必须放在图像数据块之前。
3、图像数据块IDAT(image data chunk):存储实际图像数据。PNG数据允许包含多个连续的图像数据块。
4、图像结束数据IEND(image trailer chunk):放在文件尾部,表示PNG数据流结束
二、PNG格式文件的压缩算法
PNG格式文件采用的是从LZ77派生的一个称为DEFLATE的非专利无失真式压缩算法,这个算法对图像里的直线进行预测然后存储颜色差值,这使得PNG经常能获得比原始图像更大的压缩率。
PNG算法的压缩过程一般有以下几个步骤:
1、图像信息由数据过滤器(delta filtering)进行处理, delta filtering是一个无损的数据过滤算法,它不会改变图像信息的大小,但是会让图像信息具有更高的可压缩性。
2、被处理过的数据将会用Ziv-Lempel(LZ77)算法进行处理,处理后的数据被Huffman 算法压缩,得到最后的PNG格式的图像数据,过程可用下图表示。
LZ77压缩算法原理
为了更好地说明LZ77算法的原理,首先介绍算法中用到的几个术语:
1.输入数据流(input stream):要被压缩的字符序列。
2.字符(character):输入数据流中的基本单元。
3.编码位置(coding position):输入数据流中当前要编码的字符位置,指前向缓冲存储器中的开始字符。
4.前向缓冲存储器(Lookahead buffer):存放从编码位置到输入数据流结束的字符序列的存储器。
5.窗口(window):指包含W个字符的窗口,字符是从编码位置开始向后数也就是最后处理的字符数。
6.指针(pointer):指向窗口中的匹配串且含长度的指针。
LZ77编码算法的核心是查找从前向缓冲存储器开始的最长的匹配串。编码算法的具体执行步骤如下:
1.把编码位置设置到输入数据流的开始位置。
2.查找窗口中最长的匹配串。
3.以“(Pointer, Length) Characters”的格式输出,其中Pointer是指向窗口中匹配串的指针,Length表示匹配字符的长度,Characters是前向缓冲存储器中的不匹配的第1个字符。
4.如果前向缓冲存储器不是空的,则把编码位置和窗口向前移(Length+1)个字符,然后返回到步骤2
(2) 使用LZ77算法进行压缩
如果当前处理开始字节的串在窗口中有匹配串,就先输出一个标志位,表明下面是一个(之间的距离,匹配长度)对,然后输出(之间的距离,匹配长度)对,再从刚才处理完的串之后的下一个字节继续处理。如果当前处理字节开始的串在窗口中没有匹配串,就先输出一个标志位,表明下面是一个没有改动的字节,然后不做改动的输出当前处理字节,再继续处理下一个字节。
伪代码如下:
压缩一段字节流,src - 源数据区,srclen - 源数据区字节长度,dest - 压缩数据区,返回值 0 压缩数据长度,返回值 = 0 数据无法压缩,返回值 0 压缩中异常错误
int CCompressLZ77::Compress(BYTE* src, int srclen, BYTE* dest)
{
CurByte - 0
CurBit - 0
pWnd - src;
原创力文档


文档评论(0)