算法缩法
首先你需要了解几个概念,有损压缩,量化,行程编码。
对一副图片来说,bitmap就是原始格式,没经过任何压缩的。
量化就是把所有0-255的像素值进行归类,然后分成尽量少的积累,这要存储量就小很多了,对于JEPG来说量化是有损压缩的起源。
最后就是对所有的已经归类过的点进行行程编码,然后就压缩完了
② 常用的数据压缩算法有哪些
1、RLE算法:又叫Run Length Encoding,是一个针对无损压缩的非绝高伏常简单的算法。它用重复字节和重复的次数来简单描述来代替重复的字节。
2、哈夫曼算法:无损压缩当中最好的方法。它使用预先二进制描述来替换每个符号,长度由特殊符号出现的频率决定。常见的符号需要很少的位来表示,而不常见的符号需要很多为来表示。
3、Rice算法:对于由大word组成的数据和教并携低的数据值,Rice 编码能够获得较好的压缩比。念返
③ 压缩算法原理
哈夫曼
哈夫曼编码是无损压缩当中最好的方法。它使用预先二进制描述来替换每个符号,长度由特殊符号出现的频率决定。常见的符号需要很少的位来表示,而不常见的符号需要很多为来表示。
哈夫曼算法在改变任何符号二进制编码引起少量密集表现方面是最佳的。然而,它并不处理符号的顺序和重复或序号的序列。
2.1 原理
我不打算探究哈夫曼编码的所有实际的细节,但基本的原理是为每个符号找到新的二进制表示,从而通常符号使用很少的位,不常见的符号使用较多的位。
简短的说,这个问题的解决方案是为了查找每个符号的通用程度,我们建立一个未压缩数据的柱状图;通过递归拆分这个柱状图为两部分来创建一个二叉树,每个递归的一半应该和另一半具有同样的权(权是 ∑ N K =1 符号数 k , N 是分之中符号的数量,符号数 k 是符号 k出现的次数 )
这棵树有两个目的:
1. 编码器使用这棵树来找到每个符号最优的表示方法
2. 解码器使用这棵树唯一的标识在压缩流中每个编码的开始和结束,其通过在读压缩数据位的时候自顶向底的遍历树,选择基于数据流中的每个独立位的分支,一旦一个到达叶子节点,解码器知道一个完整的编码已经读出来了。
压缩后的数据流是 24 位(三个字节),原来是 80 位( 10 个字节)。当然,我应该存储哈夫曼树,这样解码器就能够解码出对应的压缩流了,这就使得该例子中的真正数据流比输入的流数据量大。这是相对较短的数据上的副作用。对于大数据量来说,上面的哈夫曼树就不占太多比例了。
解码的时候,从上到下遍历树,为压缩的流选择从左 / 右分支,每次碰到一个叶子节点的时候,就可以将对应的字节写到解压输出流中,然后再从根开始遍历。
2.2 实现
哈夫曼编码器可以在基本压缩库中找到,其是非常直接的实现。
这个实现的基本缺陷是:
1. 慢位流实现
2. 相当慢的解码(比编码慢)
3. 最大的树深度是 32 (编码器在任何超过 32 位大小的时候退出)。如果我不是搞错的话,这是不可能的,除非输出的数据大于 2 32字节。
另一方面,这个实现有几个优点:
1. 哈夫曼树以一个紧密的形式每个符号要求 12 位(对于 8 位的符号)的方式存储,这意味着最大的头为 384 。
2. 编码相当容易理解
哈夫曼编码在数据有噪音的情况(不是有规律的,例如 RLE )下非常好,这中情况下大多数基于字典方式的编码器都有问题。
④ C语言都有哪些经典的无损压缩算法
C语言经典的无损压缩算法有:哈夫曼算法、LZ。
哈夫曼算法:
哈夫曼编码是David A. Huffman于1952年发明的一种满足对编码算法要求的一种编码算法。
哈夫曼算法是利用频率信息构造一棵二叉树,频率高的离根节点近(编码长度短),频率低的离根节点远(编码长度长),手动构造方法是先将字母按照频率从小到大排序,然后不断选择当前还没有父节点的节点中权值最小的两个,构造新的父节点,父节点的值为这两个节点值的和,直到构造成一棵二叉树。
LZ算法:
LZ算法及其衍生变形算法是压缩算法的一个系列。LZ77和LZ78算法分别在1977年和1978年被创造出来。虽然他们名字差不多,但是算法方法完全不同。这一系列算法主要适用于字母数量有限的信息,比如文字、源码等。流行的GIF和PNG格式的图像,使用颜色数量有限的颜色空间,其压缩就采用了两种算法的灵活变形应用。
⑤ 哪一种压缩算法压缩效果最好
7Zip极限压缩,效果最好,数据文件实测压缩率可达15%,已压缩文件可达80%!唯一缺点洞轿梁是解压和压缩同时极慢!想要速纳运度可帆亮以用Zip!但Zip效果可能最差!
⑥ 压缩的算法都有哪些
只有最常见的zip的,估计你都要研究上n久了。。。
文本文件一般有zip,rar,
网页文件有htz
视频文件有rm,avi
语音文件有mp3,
图片文件有png,gif,jpg
这些都是文件压缩的。。。。
------------------------------------
ZIP文件的总体格式
分文件头信息+文件压缩数据
中心目录+中心目录记录结束符
1.分文件头信息:
字节数 描述
4 分文件头信息标志(0x04034b50)
2 解压缩所需版本
2 通用比特标志位(置比特0位=加密;置比特1位=使用压
缩方式6,并使用8k变化目录,否则使用4k变化目录;置比特2位=使用压
缩方式6,并使用3个ShannonFano树对变化目录输出编码,否则使用2个
ShannonFano树对变化目录输出编码,其它比特位未用)
2 压缩方式(0=不压缩,1=缩小,2=以压缩因素1缩小,3=以
压缩因素2缩小,4=以压缩因素3缩小,5=以压缩因素4缩小,6=自展)
2 文件最后修改时间
2 文件最后修改日期
4 32位校验码
4 压缩文件大小
4 未压缩文件大小
2 文件名长
2 扩展段长
? 文件名(不定长)
? 扩展段(不定长)
2.中心目录结构
文件头信息...中心目录记录结束符
文件头:
字节数 描述
4 中心文件头信息标志(0x02014b50)
2 主机操作系统(高位字节表示主机操作系统,低位字
节表示ZIP压缩软件版本号,其值除以10表示主版本号,其值模10表示
次版本号。0=MS-DOS,OS/2 FAT文件系统,1=Ami ga,2=VMS,3=Unix及
变种,4=VM/CMS,5=AtariST,6=OS/2 HPFS,7=Macintosh,8=Z-System,9
=C P/M,10-255未用)
2 解压缩所需版本
2 通用比特标志
2 压缩方式
2 文件最后修改时间(用标准的MS-DOS时间日 期格式
编码)
2 文件最后修改日期
4 32位校验码(使用David Schwaderer的CRC-32算法产
生)
4 压缩文件大小
4 未压缩文件大小
2 文件名长
2 扩展段长
2 文件注释长(分别为文件名长,扩展段,注释 段,小于
64K)
2 磁盘起始号(本文件在磁盘中的起始号)
2 内部文件属性(最低位若置1,表示为ASC文本,否则为
二进制数据,其它位未用)
4 外部文件属性(依赖于主机操作系统)
4 分文件头相对位移
? 文件名(不定长)
? 扩展段(不定长,用于未来扩展,低版本为0长)
? 文件注释(不定长)
3.中心目录记录结束符
字节数 描述
4 中心目录标记结束符(0x06054b50)
2 磁盘号(其中包括中心目录结束记录)
2 磁盘中心目录起始号
2 磁盘中心目录入口总数
2 中心目录入口总数(ZIP文件中的文件总数)
2 整个中心目录大小
4 关于起始磁盘号的中心目录初始偏移
2 ZIP文件注释长度
? ZIP文件注释(不定长)
加密方法
PKZIP中使用的加密方法由Roger Schlafly提供。ZIP文件在解压
缩前必须先解密。每个加密文件具有一个12字节的加密文件头扩展信
息,存储于数据区的起始位置,加密前先设置一个起始值,然后被三个3
2位的密钥加密。密钥被使用者提供的口令初始化。12个字节加密之
后,由PKZIP的伪随机数产生方法,结合PKZIP中使用CRC-32算法对密钥
进行更新。
具体实施分为三步:
1.用口令对三个32位密钥初始化。
K(0)=305419896,K(1)=591751049,K(2)=878082192
循环 for i=0 to length(password)-1
调用更新密钥函数 update_keys(password(i))
结束循环(循环口令长度次)
其中更新密钥函数为:
update_keys(char):
Key(0)=crc32(key(0),char)
Key(1)=Key(1)+(Key(0)& 000000ffH)
Key(1)=Key(1)*134775813+1
Key(2)=crc32(Key(2),Key(1)〉〉24)
end update_keys
CRC32函数中,给定一个4字节的CRC值和一个字符,返回一个由CRC
-32算法更新的CRC。具体为:
crc32(c,b)=crc32tab[(c^b)&0xff]^(c>>8),crc32tab[256]的值
为固定的256个4字节数。
2.读取并加密12字节的加密头,再次对密钥进行初始化。
将12个字节的加密头读入缓冲区buffer(0)至buffer(11),循环fo
r i=0 to 11
C=buffer(i)^decrypt_byte()
update_keys(C)
buffer(i)=C
结束循环(循环12次)
其中的decrypt_byte()函数为:
unsigned char decrypt_byte()
local unsigned short temp
temp=Key(2)¦2
decrypt_byte=((temp*(temp^1))>>8)&0xff
end decrypt_byte
该步结束后,缓冲区中最后的二个字节buffer(10)和buffer(11)
将成为加密文件校验码的二个最高位(按低至高顺序存放)。对ZIP加
密文件进行解压缩前,PKUNZIP软件将使用者提供的口令按上述二个步
骤进行处理,得到的结果与校验码的二个高位字节进行比较,只有当提
供了正确的口令时,结果一致,才能进行后续的解压缩过程,否则,PKZI
P报告错误信息,程序自动结束。
3.读取压缩的数据流并以加密密钥对其进行加密。
压缩数据流按下述过程加密:
循环 直至数据流结束
C=数据流的一个字节
temp=C^decrypt_byte()
update_keys(temp)
输出temp
结束循环
⑦ 图像缩放的缩放算法
假设源图像如下图所示:
要将该图像放大两倍,可以有很多种算法,最简单的方法为邻域插值,即将每一个原像素原封不动地复制映射到扩展后对应四个像素中:
这种方法在放大图像的同时保留了所有的原图像的所搜漏凳有信息,但是会产生锯齿现象。
双线性插值的效果对于放大的图像而言较领域插值来得平滑,但是却使得图像变得模糊而且仍然会有一部分锯齿现象。
双三次插值更好比双线性插值更好世旅。
对于低分辨率或颜色很少的(通常是从2到256色)图像的放大问题,效果最好的算法是hq2x算法或类似的缩放算法。这些算法将会产生锐边并保留大量的细节,其效果如下:
对于照片(以及有许多色阶的光栅图像)的缩放算法可以参看一种搜薯被称为超采样(supersampling)的反锯齿算法。
⑧ 二进制压缩算法有哪些
二进制数据压缩算法二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”,由18世纪德国数理哲学大师莱布尼兹发现。当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的。计算机中的二进制则是一个非常微小的开关,用“开”来表示1,“关”来表示0。
20世纪被称作第三次科技革命的重要标志之一的计算机的发明与应用,因为数字计算机只能识别和处理由‘0’。‘1’符号串组成的代码。其运算模式正是二进制。19世纪爱尔兰逻辑学家乔治布尔对逻辑命题的思考过程转化为对符号“0‘’。‘’1‘’的某种代数演算,二进制是逢2进位的进位制。0、1是基本算符。因为它只使用0、1两个数字符号,非常简单方便,易于用电子方式实现。
二进制压缩 - 算法
二进制压缩
在编程时遇到每个数据只有两种状态,且 dfs 或者 bfs 时遍历时间复杂度高时,可以采用二进制压缩数据,尤其是二维数组。LZFSE
1,zlib和gzip都对deflate进行了封装,比deflate多了数据头和尾
1,苹果开源了新的无损压缩算法 LZFSE ,该算法是去年在iOS 9和OS X 10.10中 引入 的。按照苹果公司的说法,LZFE的压缩增益和ZLib level 5相同,但速度要快2~3倍,能源效率也更高。
LZFSE基于Lempel-Ziv,并使用了 有限状态熵编码,后者基于Jarek Duda在
非对称数字系统(ANS)方面所做的熵编码工作。简单地讲,ANS旨在“终结速度和比率的平衡”,既可以用于精确编码,又可以用于快速编码,并且具有数据加密功能。使用ANS代替更为传统的
Huffman和 算术编码方法的压缩库 越来越多,LZFSE就位列其中。
显然,LZFSE的目标不是成为最好或最快的算法。事实上,苹果公司指出,
LZ4的压缩速度比LZFSE快,而 LZMA提供了更高的压缩率,但代价是比Apple
SDK提供的其他选项要慢一个数量级。当压缩率和速度几乎同等重要,而你又希望降低能源效率时,LZFSE是苹果推荐的选项。
GitHub上提供了LZFSE的参考实现。在MacOS上构建和运行一样简单:
$ xcodebuild install DSTROOT=/tmp/lzfse.dst
如果希望针对当前的iOS设备构建LZFSE,可以执行:
xcodebuild -configuration “Release” -arch armv7 install DSTROOT=/tmp/lzfse.dst
除了 API文档之外,苹果去年还提供了一个 示例项目,展示如何使用LZFSE 进行块和流压缩,这是一个实用的LZFSE入门资源。
LZFSE是在谷歌 brotli之后发布的,后者在去年开源。与LZFSE相比,brotli 似乎是针对一个不同的应用场景进行了优化,比如压缩静态Web资产和Android APK,在这些情况下,压缩率是最重要的。
⑨ 矢量数据的常用压缩方法
矢量数据的常用压缩方法:间隔取点法、垂距法、光栏法。
数据有计量尺度:
1、名类尺度(Nominal scale,亦称分类尺度、列名尺度等)是这样一种品质标志,按照它可对研究客体进行平行的分类或分组,使同类同质,异类异质。例如,按照性别将人口分为男、女两类;按照经济性质将企业分为国有、集体、私营、混合制企业等。
2、顺序尺度(Ordinal scale,亦称序数尺度、顺位尺度等)是这样一种品质标志,利用它不仅能将事物分成不同的类别,还可确定这些类别的等级差别或序列差别。例如“产品等级”就是一种测度产品质量好坏的顺序尺度,它可将产品分为一等品、二等品、三等品、次品等。
3、区间尺度(Interval scale,亦称间隔尺度、等距尺度、定距尺度等)是能测度事物类别或次序之间间距的数量标志,更具体些说,区间尺度是可将事物区分为不同类别,对这些类别进行排序,并较准确度量类别之间数量差距的一种计量尺度。
4、比尺度(Ratio scale,亦称为比率尺度)的计量结果也表示为数值,跟区间尺度属同一层次,有时对两者可不作区分。比尺度这种数量标志不仅能测度各类别的大小和多少,还有一个绝对零点(Absolute zero)作为起点。
⑩ 现今的图像压缩算法有哪些急...
浅谈图像压缩算法
余科亮
本文仅讨论静止图像的压缩基本算法,图像压缩的目的在于以较少的数据来
表示图像以节约存储费用,或者传输时间和费用。
JPEG压缩算法可以用失真的压缩方式来处理图像,但失真的程度却是肉眼所
无法辩认的。这也就是为什么JPEG会有如此满意的压缩比例的原因。
下面主要讨论,JPEG基本压缩法。
一.JPEG压缩过程
JPEG压缩分四个步骤实现:
1.颜色模式转换及采样;
2.DCT变换;
3.量化;
4.编码。
二.1.颜色模式转换及采样
RGB色彩系统是我们最常用的表示颜色的方式。JPEG采用的是YCbCr色彩系统。
想要用JPEG基本压缩法处理全彩色图像,得先把RGB颜色模式图像数据,转换为
YCbCr颜色模式的数据。Y代表亮度,Cb和Cr则代表色度、饱和度。通过下列计算
公式可完成数据转换。
Y=0.2990R+0.5870G+0.1140B
Cb=-0.1687R-0.3313G+0.5000B+128
Cr=0.5000R-0.4187G-0.0813B+128
人类的眼晴对低频的数据比对高频的数据具有更高的敏感度,事实上,人类
的眼睛对亮度的改变也比对色彩的改变要敏感得多,也就是说Y成份的数据是比较
重要的。既然Cb成份和Cr成份的数据比较相对不重要,就可以只取部分数据来处
理。以增加压缩的比例。JPEG通常有两种采样方式:YUV411和YUV422,它们所代
表的意义是Y、Cb和Cr三个成份的数据取样比例。
2.DCT变换
DCT变换的全称是离散余弦变换(Discrete Cosine Transform),是指将一组
光强数据转换成频率数据,以便得知强度变化的情形。若对高频的数据做些修饰,
再转回原来形式的数据时,显然与原始数据有些差异,但是人类的眼睛却是不容
易辨认出来。
压缩时,将原始图像数据分成8*8数据单元矩阵,例如亮度值的第一个矩阵内
容如下:
JPEG将整个亮度矩阵与色度Cb矩阵,饱和度Cr矩阵,视为一个基本单元称作
MCU。每个MCU所包含的矩阵数量不得超过10个。例如,行和列采样的比例皆为4:
2:2,则每个MCU将包含四个亮度矩阵,一个色度矩阵及一个饱和度矩阵。
当图像数据分成一个8*8矩阵后,还必须将每个数值减去128,然后一一代入
DCT变换公式中,即可达到DCT变换的目的。图像数据值必须减去128,是因为DCT
转换公式所接受的数字范围是在-128到+127之间。
DCT变换公式:
x,y代表图像数据矩阵内某个数值的坐标位置
f(x,y)代表图像数据矩阵内的数个数值
u,v代表DCT变换后矩阵内某个数值的坐标位置
F(u,v)代表DCT变换后矩阵内的某个数值
u=0 且 v=0 c(u)c(v)=1/1.414
u>0 或 v>0 c(u)c(v)=1
经过DCT变换后的矩阵数据自然数为频率系数,这些系数以F(0,0)的值最
大,称为DC,其余的63个频率系数则多半是一些接近于0的正负浮点数,一概称
之为AC。
3、量化
图像数据转换为频率系数后,还得接受一项量化程序,才能进入编码阶段。
量化阶段需要两个8*8矩阵数据,一个是专门处理亮度的频率系数,另一个则是
针对色度的频率系数,将频率系数除以量化矩阵的值,取得与商数最近的整数,
即完成量化。
当频率系数经过量化后,将频率系数由浮点数转变为整数,这才便于执行最
后的编码。不过,经过量化阶段后,所有数据只保留整数近似值,也就再度损失
了一些数据内容,JPEG提供的量化表如下:
4、编码
Huffman编码无专利权问题,成为JPEG最常用的编码方式,Huffman编码通常
是以完整的MCU来进行的。
编码时,每个矩阵数据的DC值与63个AC值,将分别使用不同的Huffman编码
表,而亮度与色度也需要不同的Huffman编码表,所以一共需要四个编码表,才
能顺利地完成JPEG编码工作。
DC编码
DC是彩采用差值脉冲编码调制的差值编码法,也就是在同一个图像分量中取
得每个DC值与前一个DC值的差值来编码。DC采用差值脉冲编码的主要原因是由于
在连续色调的图像中,其差值多半比原值小,对差值进行编码所需的位数,会比
对原值进行编码所需的位数少许多。例如差值为5,它的二进制表示值为101,如
果差值为-5,则先改为正整数5,再将其二进制转换成1的补数即可。所谓1的补
数,就是将每个Bit若值为0,便改成1;Bit为1,则变成0。差值5应保留的位数
为3,下表即列出差值所应保留的Bit数与差值内容的对照。
在差值前端另外加入一些差值的霍夫曼码值,例如亮度差值为5(101)的位
数为3,则霍夫曼码值应该是100,两者连接在一起即为100101。下列两份表格分
别是亮度和色度DC差值的编码表。根据这两份表格内容,即可为DC差值加上霍夫
曼码值,完成DC的编码工作。
AC编码
AC编码方式与DC略有不同,在AC编码之前,首先得将63个AC值按Zig-zag排
序,即按照下图箭头所指示的顺序串联起来。
63个AC值排列好的,将AC系数转换成中间符号,中间符号表示为RRRR/SSSS,
RRRR是指第非零的AC之前,其值为0的AC个数,SSSS是指AC值所需的位数,AC系
数的范围与SSSS的对应关系与DC差值Bits数与差值内容对照表相似。
如果连续为0的AC个数大于15,则用15/0来表示连续的16个0,15/0称为ZRL
(Zero Rum Length),而(0/0)称为EOB(Enel of Block)用来表示其后所
剩余的AC系数皆等于0,以中间符号值作为索引值,从相应的AC编码表中找出适
当的霍夫曼码值,再与AC值相连即可。
例如某一组亮度的中间符为5/3,AC值为4,首先以5/3为索引值,从亮度AC
的Huffman编码表中找到1111111110011110霍夫曼码值,于是加上原来100(4)
即是用来取[5,4]的Huffman编码1111111110011110100,[5,4]表示AC值为4的
前面有5个零。
由于亮度AC,色度AC霍夫曼编码表比较长,在此省略去,有兴趣者可参阅相
关书籍。
实现上述四个步骤,即完成一幅图像的JPEG压缩。
参考资料
[1] 林福宗 《图像文件格式(上)——Windows 编程》,清华大学出版社,
1996年
[2] 李振辉、李仁各编着,《探索图像文件的奥秘》,清华大学出版社,1996年
[3] 黎洪松、成实译《JPEG静止数据压缩标准》,学苑出版社,1996年