
以下部分内容来自 百度百科 ,还会有一部分是自己的见解,我写这篇文章的目的是既让大家可以了解百度上已有的知识,但是不用再去找百度,还有就是可以看到我关于这种格式的深层次的了解,看完这篇,包括我在内,会感觉到即使很小很小的一个知识点,深入以后都是非常深的,底层和深层次原理是我的最爱,这也是我写博客的初衷和目的。
GIF(Graphics Interchange Format) 的原义是“ 图像 互换格式”,是 CompuServe 公司在 1987年开发的 图像文件格式 。GIF文件的数据,是一种基于 LZW算法 的连续色调的无损 压缩格式 。其 压缩率 一般在 50% 左右,它不属于任何应用 程序 。GIF格式可以存多幅彩色图像,如果把存于一个文件中的多幅 图像数据 逐幅读出并显示到屏幕上,就可构成一种最简单的动画。
GIF图象是基于颜色列表的(存储的数据是该点的颜色对应于颜色列表的索引值),最多只支持8位(256色)。GIF文件内部分成许多存储块,用来存储多幅图象或者是决定图象表现行为的控制块,用以实现动画和交互式应用。GIF文件还通过LZW压缩算法压缩图象数据来减少图象尺寸。
GIF格式自1987年由 CompuServe 公司引入后,因其体积小、成像相对清晰,特别适合于初期慢速的 互联网 ,而大受欢迎。
在早期, GIF 所用的LZW压缩算法是Compuserv所开发的一种免费算法。然而令很多软件开发商感到意外的是,GIF文件所采用的压缩算法忽然成了 Unisys 公司的专利。
据Unisys公司称,他们已注册了 LZW算法 中的W部分。如果要开发生成(或显示)GIF文件的程序,则需向该公司支付版税。由此,人们开始寻求一种新技术,以减少开发成本。 PNG ( Portable Network Graphics ,便携网络图形)标准就在这个背景下应运而生了。它一方面满足了市场对更少的法规限制的需要,另一方面也带来了更少的技术上的限制,如颜色的数量等。
在2003年6月20日,LZW算法在美国的专利权已到期而失效。在欧洲、日本及加拿大的专利权亦已分别在2004年的6月18日、6月20日和7月7日到期失效。尽管如此,PNG文件格式凭着其技术上的优势,已然跻身于网络上第三广泛应用格式。与GIF相关的专利于2006年8月11日过期。
长久以来,iOS一直被吐槽不能用GIF。造成这一局面的主要原因是:
GIF分为静态GIF和动画GIF两种,扩展名为gif,是一种压缩 位图 格式,支持透明 背景图像 ,适用于多种 *** 作系统,“体型”很小,网上很多小动画都是GIF格式。其实GIF是将多幅图像保存为一个图像文件,从而形成动画,最常见的就是通过一帧帧的动画串联起来的搞笑gif图,所以归根到底GIF仍然是 文件格式 。
但GIF只能显示256色。和 jpg格式 一样,这是一种在网络上非常流行的图形文件格式。
GIF主要分为两个版本,即 GIF 89a 和 GIF 87a
此给出的语法用来说明形成gif 数据流 的块序列,用一些规则列表来表达。下面列出用于gif语法的符号定义。
gif语法的符号定义:<GIF 数据流 > ::= 头部 <;逻辑视屏> <;数据> 尾记录
gif 数据流 中的 数据块 可以分为三组:控制块、成象块和特殊用途块。
色表- gif格式利用色表来显示基于光栅的图像。色表分为全局色表和局部色表。全局色表对于那些没有设置局部色表的图像起作用。全局色表的作用域是整个 数据流 。局部色表对于紧接在其后的单张图像起作用。这两种色表都是可选的。
全局色表这东西是我们感兴趣的东西,它有点像png格式定义种的调色板,如果要修改gif的颜色,哈哈,修改这个全局色表就可以,如果有全局色表块,那么它一定从gif流的14个字节开始(头部6个 + 逻辑视频描述块7个)。
以下是各 数据块 的说明,如果注明为版本89a的话,则说明这个数据块不会在87a版的协议中出现。
Packed Fields 说明:
GIF文件内部是按块划分的,包括 控制块( Control Block ) 和 数据块(DataSub-blocks) 两种。控制块是控制数据块行为的,根据不同的控制块包含一些不同的控制参数;数据块只包含一些8-bit的字符流,由它前面的控制块来决定它的功能,每个数据块大小从0到255个字节,数据块的第一个字节指出这个数据块大小(字节数),计算数据块的大小时不包括这个字节,所以一个空的数据块有一个字节,那就是数据块的大小0x00。 下表是一个数据块的结构:
一个GIF文件的结构可分为文件头(File Header)、GIF数据流(GIF DataStream)和文件终结器(Trailer)三个部分。文件头包含GIF文件署名(Signature)和版本号(Version);GIF数据流由控制标识符、图象块(ImageBlock)和其他的一些扩展块组成;文件终结器只有一个值为0x3B的字符('';'')表示文件结束。下表显示了一个GIF文件的组成结构:
是用来标识GIF署名(Signature)和版本号(Version)的。
GIF署名用来确认一个文件是否是GIF格式的文件,这一部分由三个字符组成:"GIF";文件版本号也是由三个字节组成,可以为"87a"或"89a"。具体如下图所示。
它包含了很多的部分。
(1) 逻辑屏幕标识符 (Logical Screen Descriptor) :这一部分由7个字节组成,定义了GIF图象的大小 (Logical Screen Width &Height) 、颜色深度 (Color Bits) 、背景色 (Blackground ColorIndex) 以及有无全局颜色列表 (Global Color Table) 和颜色列表的索引数 (IndexCount) ,具体描述见下图。
也可以参考下图。
(2)全局颜色列表 (Global Color Table) :
全局颜色列表必须紧跟在逻辑屏幕标识符后面,每个颜色列表索引条目由三个字节组成,按R、G、B的顺序排列。
(3)图象标识符 (Image Descriptor) :一个GIF文件内可以包含多幅图象,一幅图象结束之后紧接着下是一幅图象的标识符,图象标识符以0x2C('','')字符开始,定义紧接着它的图象的性质,包括图象相对于逻辑屏幕边界的偏移量、图象大小以及有无局部颜色列表和颜色列表大小,由10个字节组成,具体如下所示。
也可以参考下图。
(4)局部颜色列表 (Local Color Table) :如果上面的局部颜色列表标志置位的话,则需要在这里(紧跟在图象标识符之后)定义一个局部颜色列表以供紧接着它的图象使用,注意使用前应线保存原来的颜色列表,使用结束之后回复原来保存的全局颜色列表。如果一个GIF文件即没有提供全局颜色列表,也没有提供局部颜色列表,可以自己创建一个颜色列表,或使用系统的颜色列表。局部颜色列表的排列方式和全局颜色列表一样:RGBRGB
(5) 基于颜色列表的图象数据 (Table-Based Image Data) :由两部分组成: LZW 编码长度 (LZW Minimum Code Size) 和图象数据 (Image Data) 。
下面给出总体的存储结构的原理图。
PC上制作软件主要为 Adobe ImageReady 和 fireworks 两个。
WEB上gif在线制作编辑 gif5net ,支持 、视频、FLASH转GIF。
我一般使用 LICEcap 制作gif图。
1 百度百科
2 GIF的文件储存结构和动画原理
3 GIF原理和储存结构深入解析
文件压缩原理
我们使用计算机所做的事情大多都是对文件进行处理。每个文件都会占用一定的磁盘空间,我们希望一些文件,尤其是暂时不用但又比较重要不能删除的文件(如备份文件,有点像鸡肋呀),尽可能少的占用磁盘空间。但是,许多文件的存储格式是比较松散的,这样就浪费了一些宝贵的计算机存储资源。这时,我们可以借助压缩工具解决这个问题,通过对原来的文件进行压缩处理,使之用更少的磁盘空间保存起来,当需要使用时再进行解压缩 *** 作,这样就大大节省了磁盘空间。当你要拷贝许多小文件时,通过压缩处理可以提高执行效率。如果小文件很多, *** 作系统要执行频繁的文件定位 *** 作,需要花费很多的时间。如果先把这些小文件压缩,变成一个压缩文件后,再拷贝时就很方便了。由于计算机处理的信息是以二进制数的形式表示的,因此压缩软件就是把二进制信息中相同的字符串以特殊字符标记来达到压缩的目的。为了有助于理解文件压缩,请您在脑海里想象一幅蓝天白云的。对于成千上万单调重复的蓝色像点而言,与其一个一个定义“蓝、蓝、蓝……”长长的一串颜色,还不如告诉电脑:“从这个位置开始存储1117个蓝色像点”来得简洁,而且还能大大节约存储空间。这是一个非常简单的图像压缩的例子。其实,所有的计算机文件归根结底都是以“1”和“0”的形式存储的,和蓝色像点一样,只要通过合理的数学计算公式,文件的体积都能够被大大压缩以达到“数据无损稠密”的效果。总的来说,压缩可以分为有损和无损压缩两种。如果丢失个别的数据不会造成太大的影响,这时忽略它们是个好主意,这就是有损压缩。有损压缩广泛应用于动画、声音和图像文件中,典型的代表就是影碟文件格式mpeg、音乐文件格式mp3和图像文件格式jpg。但是更多情况下压缩数据必须准确无误,人们便设计出了无损压缩格式,比如常见的zip、rar等。压缩软件(compression software)自然就是利用压缩原理压缩数据的工具,压缩后所生成的文件称为压缩包(archive),体积只有原来的几分之一甚至更小。当然,压缩包已经是另一种文件格式了,如果你想使用其中的数据,首先得用压缩软件把数据还原,这个过程称作解压缩。常见的压缩软件有winzip、winrar等
分类: 电脑/网络 >> 程序设计 >> 其他编程语言
问题描述:
压缩壳是如何使压缩后的文件变小的?关于什么是壳,壳压缩了什么就不要讲了,我很清楚,我只想知道用的是什么算法
讲的出来的我会加分的(加到300),不懂的就不要从网上给我贴一堆资料出来,我都看过,我不会给分的
解析:
最根本的原理:
所有的文件在存储中都是以0和1的形式存在的。比如说一个文件的字节内容是“111111100000000000000000000000000000000000000000000000001111”,你要完全写出来的话,会很长很长,但如果你用“1{7}0{49}1{4}”来描述它(当然这只是为方便说明这样写,并不是真的是一种压缩算法),也能得到同样的信息,但却只有13个字节,这样就减小了文件体积。有些算法是无损的,也就是说都可以还原成与原文件一模一样;也有些算法是有损算法,但一般压缩比高一点,可以压缩得更小。
一般压缩壳很少用自己独创的压缩算法,都是根据需要选用已经很成熟了的算法在具体应用中,文件都相当复杂,根据一定的数学算法,权衡把哪段字节用一个特定的更小字节代替,就可以实现数据最大程度的无损压缩相同类型的文件,其内部也具有很多相似的结构,所有有很多算法都是针对具体文件类型才有最大的效率,比如gzip,zlib,以及图形格式png使用deflate压缩算法,gif用lzw算法,等等这些算法也能用于可执行文件压缩壳把全部文件资源(一般就是一个可执行程序)用一种或几种算法进行压缩,运行时再解压缩释放到内存,然后让系统运行它
电脑里的数据压缩其实类似于美眉们的瘦身运动,不外有两大功用。第一,可以节省空间。拿瘦身美眉来说,要是八个美眉可以挤进一辆出租车里,那该有多省钱啊!第二,可以减少对带宽的占用。例如,我们都想在不到 100Kbps 的 GPRS 网上观看 DVD 大片,这就好比瘦身美眉们总希望用一尺布裁出七件吊带衫,前者有待于数据压缩技术的突破性进展,后者则取决于美眉们的恒心和毅力。
简单地说,如果没有数据压缩技术,我们就没法用 WinRAR 为 Email 中的附件瘦身;如果没有数据压缩技术,市场上的数码录音笔就只能记录不到 20 分钟的语音;如果没有数据压缩技术,从 Internet 上下载一部**也许要花半年的时间……可是这一切究竟是如何实现的呢?数据压缩技术又是怎样从无到有发展起来的呢? 一千多年前的中国学者就知道用“班马”这样的缩略语来指代班固和司马迁,这种崇尚简约的风俗一直延续到了今天的 Internet 时代:当我们在 BBS 上用“ 7456 ”代表“气死我了”,或是用“ B4 ”代表“ Before ”的时候,我们至少应该知道,这其实就是一种最简单的数据压缩呀。
严格意义上的数据压缩起源于人们对概率的认识。当我们对文字信息进行编码时,如果为出现概率较高的字母赋予较短的编码,为出现概率较低的字母赋予较长的编码,总的编码长度就能缩短不少。远在计算机出现之前,著名的 Morse 电码就已经成功地实践了这一准则。在 Morse 码表中,每个字母都对应于一个唯一的点划组合,出现概率最高的字母 e 被编码为一个点“ ”,而出现概率较低的字母 z 则被编码为“ -- ”。显然,这可以有效缩短最终的电码长度。
信息论之父 C E Shannon 第一次用数学语言阐明了概率与信息冗余度的关系。在 1948 年发表的论文“通信的数学理论( A Mathematical Theory of Communication )”中, Shannon 指出,任何信息都存在冗余,冗余大小与信息中每个符号(数字、字母或单词)的出现概率或者说不确定性有关。 Shannon 借鉴了热力学的概念,把信息中排除了冗余后的平均信息量称为“信息熵”,并给出了计算信息熵的数学表达式。这篇伟大的论文后来被誉为信息论的开山之作,信息熵也奠定了所有数据压缩算法的理论基础。从本质上讲,数据压缩的目的就是要消除信息中的冗余,而信息熵及相关的定理恰恰用数学手段精确地描述了信息冗余的程度。利用信息熵公式,人们可以计算出信息编码的极限,即在一定的概率模型下,无损压缩的编码长度不可能小于信息熵公式给出的结果。
有了完备的理论,接下来的事就是要想办法实现具体的算法,并尽量使算法的输出接近信息熵的极限了。当然,大多数工程技术人员都知道,要将一种理论从数学公式发展成实用技术,就像仅凭一个 E=mc 2 的公式就要去制造核武器一样,并不是一件很容易的事。 设计具体的压缩算法的过程通常更像是一场数学游戏。开发者首先要寻找一种能尽量精确地统计或估计信息中符号出现概率的方法,然后还要设计一套用最短的代码描述每个符号的编码规则。统计学知识对于前一项工作相当有效,迄今为止,人们已经陆续实现了静态模型、半静态模型、自适应模型、 Markov 模型、部分匹配预测模型等概率统计模型。相对而言,编码方法的发展历程更为曲折一些。
1948 年, Shannon 在提出信息熵理论的同时,也给出了一种简单的编码方法—— Shannon 编码。 1952 年, R M Fano 又进一步提出了 Fano 编码。这些早期的编码方法揭示了变长编码的基本规律,也确实可以取得一定的压缩效果,但离真正实用的压缩算法还相去甚远。
第一个实用的编码方法是由 D A Huffman 在 1952 年的论文“最小冗余度代码的构造方法( A Method for the Construction of Minimum Redundancy Codes )”中提出的。直到今天,许多《数据结构》教材在讨论二叉树时仍要提及这种被后人称为 Huffman 编码的方法。 Huffman 编码在计算机界是如此著名,以至于连编码的发明过程本身也成了人们津津乐道的话题。据说, 1952 年时,年轻的 Huffman 还是麻省理工学院的一名学生,他为了向老师证明自己可以不参加某门功课的期末考试,才设计了这个看似简单,但却影响深远的编码方法。
Huffman 编码效率高,运算速度快,实现方式灵活,从 20 世纪 60 年代至今,在数据压缩领域得到了广泛的应用。例如,早期 UNIX 系统上一个不太为现代人熟知的压缩程序 COMPACT 实际就是 Huffman 0 阶自适应编码的具体实现。 20 世纪 80 年代初, Huffman 编码又出现在 CP/M 和 DOS 系统中,其代表程序叫 SQ 。今天,在许多知名的压缩工具和压缩算法(如 WinRAR 、 gzip 和 JPEG )里,都有 Huffman 编码的身影。不过, Huffman 编码所得的编码长度只是对信息熵计算结果的一种近似,还无法真正逼近信息熵的极限。正因为如此,现代压缩技术通常只将 Huffman 视作最终的编码手段,而非数据压缩算法的全部。
科学家们一直没有放弃向信息熵极限挑战的理想。 1968 年前后, P Elias 发展了 Shannon 和 Fano 的编码方法,构造出从数学角度看来更为完美的 Shannon-Fano-Elias 编码。沿着这一编码方法的思路, 1976 年, J Rissanen 提出了一种可以成功地逼近信息熵极限的编码方法——算术编码。 1982 年, Rissanen 和 G G Langdon 一起改进了算术编码。之后,人们又将算术编码与 J G Cleary 和 I H Witten 于 1984 年提出的部分匹配预测模型( PPM )相结合,开发出了压缩效果近乎完美的算法。今天,那些名为 PPMC 、 PPMD 或 PPMZ 并号称压缩效果天下第一的通用压缩算法,实际上全都是这一思路的具体实现。
对于无损压缩而言, PPM 模型与算术编码相结合,已经可以最大程度地逼近信息熵的极限。看起来,压缩技术的发展可以到此为止了。不幸的是,事情往往不像想象中的那样简单:算术编码虽然可以获得最短的编码长度,但其本身的复杂性也使得算术编码的任何具体实现在运行时都慢如蜗牛。即使在摩尔定律大行其道, CPU 速度日新月异的今天,算术编码程序的运行速度也很难满足日常应用的需求。没办法,如果不是后文将要提到的那两个犹太人,我们还不知要到什么时候才能用上 WinZIP 这样方便实用的压缩工具呢。 逆向思维永远是科学和技术领域里出奇制胜的法宝。就在大多数人绞尽脑汁想改进 Huffman 或算术编码,以获得一种兼顾了运行速度和压缩效果的“完美”编码的时候,两个聪明的犹太人 J Ziv 和 A Lempel 独辟蹊径,完全脱离 Huffman 及算术编码的设计思路,创造出了一系列比 Huffman 编码更有效,比算术编码更快捷的压缩算法。我们通常用这两个犹太人姓氏的缩写,将这些算法统称为 LZ 系列算法。
按照时间顺序, LZ 系列算法的发展历程大致是: Ziv 和 Lempel 于 1977 年发表题为“顺序数据压缩的一个通用算法( A Universal Algorithm for Sequential Data Compression )”的论文,论文中描述的算法被后人称为 LZ77 算法。 1978 年,二人又发表了该论文的续篇“通过可变比率编码的独立序列的压缩( Compression of Individual Sequences via Variable Rate Coding )”,描述了后来被命名为 LZ78 的压缩算法。 1984 年, T A Welch 发表了名为“高性能数据压缩技术( A Technique for High Performance Data Compression )”的论文,描述了他在 Sperry 研究中心(该研究中心后来并入了 Unisys 公司)的研究成果,这是 LZ78 算法的一个变种,也就是后来非常有名的 LZW 算法。 1990 年后, T C Bell 等人又陆续提出了许多 LZ 系列算法的变体或改进版本。
说实话, LZ 系列算法的思路并不新鲜,其中既没有高深的理论背景,也没有复杂的数学公式,它们只是简单地延续了千百年来人们对字典的追崇和喜好,并用一种极为巧妙的方式将字典技术应用于通用数据压缩领域。通俗地说,当你用字典中的页码和行号代替文章中每个单词的时候,你实际上已经掌握了 LZ 系列算法的真谛。这种基于字典模型的思路在表面上虽然和 Shannon 、 Huffman 等人开创的统计学方法大相径庭,但在效果上一样可以逼近信息熵的极限。而且,可以从理论上证明, LZ 系列算法在本质上仍然符合信息熵的基本规律。
LZ 系列算法的优越性很快就在数据压缩领域里体现 了 出来,使用 LZ 系列算法的工具软件数量呈爆炸式增长。 UNIX 系统上最先出现了使用 LZW 算法的 compress 程序,该程序很快成为了 UNIX 世界的压缩标准。紧随其后的是 MS-DOS 环境下的 ARC 程序,以及 PKWare 、 PKARC 等仿制品。 20 世纪 80 年代,著名的压缩工具 LHarc 和 ARJ 则是 LZ77 算法的杰出代表。
今天, LZ77 、 LZ78 、 LZW 算法以及它们的各种变体几乎垄断了整个通用数据压缩领域,我们熟悉的 PKZIP 、 WinZIP 、 WinRAR 、 gzip 等压缩工具以及 ZIP 、 GIF 、 PNG 等文件格式都是 LZ 系列算法的受益者,甚至连 PGP 这样的加密文件格式也选择了 LZ 系列算法作为其数据压缩的标准。
没有谁能否认两位犹太人对数据压缩技术的贡献。我想强调的只是,在工程技术领域,片面追求理论上的完美往往只会事倍功半,如果大家能像 Ziv 和 Lempel 那样,经常换个角度来思考问题,没准儿你我就能发明一种新的算法,就能在技术方展史上扬名立万呢。 LZ 系列算法基本解决了通用数据压缩中兼顾速度与压缩效果的难题。但是,数据压缩领域里还有另一片更为广阔的天地等待着我们去探索。 Shannon 的信息论告诉我们,对信息的先验知识越多,我们就可以把信息压缩得越小。换句话说,如果压缩算法的设计目标不是任意的数据源,而是基本属性已知的特种数据,压缩的效果就会进一步提高。这提醒我们,在发展通用压缩算法之余,还必须认真研究针对各种特殊数据的专用压缩算法。比方说,在今天的数码生活中,遍布于数码相机、数码录音笔、数码随身听、数码摄像机等各种数字设备中的图像、音频、视频信息,就必须经过有效的压缩才能在硬盘上存储或是通过 USB 电缆传输。实际上,多媒体信息的压缩一直是数据压缩领域里的重要课题,其中的每一个分支都有可能主导未来的某个技术潮流,并为数码产品、通信设备和应用软件开发商带来无限的商机。
让我们先从图像数据的压缩讲起。通常所说的图像可以被分为二值图像、灰度图像、彩色图像等不同的类型。每一类图像的压缩方法也不尽相同。
传真技术的发明和广泛使用促进了二值图像压缩算法的飞速发展。 CCITT (国际电报电话咨询委员会,是国际电信联盟 ITU 下属的一个机构)针对传真类应用建立了一系列图像压缩标准,专用于压缩和传递二值图像。这些标准大致包括 20 世纪 70 年代后期的 CCITT Group 1 和 Group 2 , 1980 年的 CCITT Group 3 ,以及 1984 年的 CCITT Group 4 。为了适应不同类型的传真图像,这些标准所用的编码方法包括了一维的 MH 编码和二维的 MR 编码,其中使用了行程编码( RLE )和 Huffman 编码等技术。今天,我们在办公室或家里收发传真时,使用的大多是 CCITT Group 3 压缩标准,一些基于数字网络的传真设备和存放二值图像的 TIFF 文件则使用了 CCITT Group 4 压缩标准。 1993 年, CCITT 和 ISO (国际标准化组织)共同成立的二值图像联合专家组( Joint Bi-level Image Experts Group , JBIG )又将二值图像的压缩进一步发展为更加通用的 JBIG 标准。
实际上,对于二值图像和非连续的灰度、彩色图像而言,包括 LZ 系列算法在内的许多通用压缩算法都能获得很好的压缩效果。例如,诞生于 1987 年的 GIF 图像文件格式使用的是 LZW 压缩算法, 1995 年出现的 PNG 格式比 GIF 格式更加完善,它选择了 LZ77 算法的变体 zlib 来压缩图像数据。此外,利用前面提到过的 Huffman 编码、算术编码以及 PPM 模型,人们事实上已经构造出了许多行之有效的图像压缩算法。
但是,对于生活中更加常见的,像素值在空间上连续变化的灰度或彩色图像(比如数码照片),通用压缩算法的优势就不那么明显了。幸运的是,科学家们发现,如果在压缩这一类图像数据时允许改变一些不太重要的像素值,或者说允许损失一些精度(在压缩通用数据时,我们绝不会容忍任何精度上的损失,但在压缩和显示一幅数码照片时,如果一片树林里某些树叶的颜色稍微变深了一些,看照片的人通常是察觉不到的),我们就有可能在压缩效果上获得突破性的进展。这一思想在数据压缩领域具有革命性的地位:通过在用户的忍耐范围内损失一些精度,我们可以把图像(也包括音频和视频)压缩到原大小的十分之一、百分之一甚至千分之一,这远远超出了通用压缩算法的能力极限。也许,这和生活中常说的“退一步海阔天空”的道理有异曲同工之妙吧。
这种允许精度损失的压缩也被称为有损压缩。在图像压缩领域,著名的 JPEG 标准是有损压缩算法中的经典。 JPEG 标准由静态图像联合专家组( Joint Photographic Experts Group , JPEG )于 1986 年开始制定, 1994 年后成为国际标准。 JPEG 以离散余弦变换( DCT )为核心算法,通过调整质量系数控制图像的精度和大小。对于照片等连续变化的灰度或彩色图像, JPEG 在保证图像质量的前提下,一般可以将图像压缩到原大小的十分之一到二十分之一。如果不考虑图像质量, JPEG 甚至可以将图像压缩到“无限小”。
JPEG 标准的最新进展是 1996 年开始制定, 2001 年正式成为国际标准的 JPEG 2000 。与 JPEG 相比, JPEG 2000 作了大幅改进,其中最重要的是用离散小波变换( DWT )替代了 JPEG 标准中的离散余弦变换。在文件大小相同的情况下, JPEG 2000 压缩的图像比 JPEG 质量更高,精度损失更小。作为一个新标准, JPEG 2000 暂时还没有得到广泛的应用,不过包括数码相机制造商在内的许多企业都对其应用前景表示乐观, JPEG 2000 在图像压缩领域里大显身手的那一天应该不会特别遥远。
JPEG 标准中通过损失精度来换取压缩效果的设计思想直接影响了视频数据的压缩技术。 CCITT 于 1988 年制定了电视电话和会议电视的 H261 建议草案。 H261 的基本思路是使用类似 JPEG 标准的算法压缩视频流中的每一帧图像,同时采用运动补偿的帧间预测来消除视频流在时间维度上的冗余信息。在此基础上, 1993 年, ISO 通过了动态图像专家组( Moving Picture Experts Group , MPEG )提出的 MPEG-1 标准。 MPEG-1 可以对普通质量的视频数据进行有效编码。我们现在看到的大多数 VCD 影碟,就是使用 MPEG-1 标准来压缩视频数据的。
为了支持更清晰的视频图像,特别是支持数字电视等高端应用, ISO 于 1994 年提出了新的 MPEG-2 标准(相当于 CCITT 的 H262 标准)。 MPEG-2 对图像质量作了分级处理,可以适应普通电视节目、会议电视、高清晰数字电视等不同质量的视频应用。在我们的生活中,可以提供高清晰画面的 DVD 影碟所采用的正是 MPEG-2 标准。
Internet 的发展对视频压缩提出了更高的要求。在内容交互、对象编辑、随机存取等新需求的刺激下, ISO 于 1999 年通过了 MPEG-4 标准(相当于 CCITT 的 H263 和 H263+ 标准)。 MPEG-4 标准拥有更高的压缩比率,支持并发数据流的编码、基于内容的交互 *** 作、增强的时间域随机存取、容错、基于内容的尺度可变性等先进特性。 Internet 上新兴的 DivX 和 XviD 文件格式就是采用 MPEG-4 标准来压缩视频数据的,它们可以用更小的存储空间或通信带宽提供与 DVD 不相上下的高清晰视频,这使我们在 Internet 上发布或下载数字**的梦想成为了现实。
就像视频压缩和电视产业的发展密不可分一样,音频数据的压缩技术最早也是由无线电广播、语音通信等领域里的技术人员发展起来的。这其中又以语音编码和压缩技术的研究最为活跃。自从 1939 年 H Dudley 发明声码器以来,人们陆续发明了脉冲编码调制( PCM )、线性预测( LPC )、矢量量化( VQ )、自适应变换编码( ATC )、子带编码( SBC )等语音分析与处理技术。这些语音技术在采集语音特征,获取数字信号的同时,通常也可以起到降低信息冗余度的作用。像图像压缩领域里的 JPEG 一样,为获得更高的编码效率,大多数语音编码技术都允许一定程度的精度损失。而且,为了更好地用二进制数据存储或传送语音信号,这些语音编码技术在将语音信号转换为数字信息之后又总会用 Huffman 编码、算术编码等通用压缩算法进一步减少数据流中的冗余信息。
对于电脑和数字电器(如数码录音笔、数码随身听)中存储的普通音频信息,我们最常使用的压缩方法主要是 MPEG 系列中的音频压缩标准。例如, MPEG-1 标准提供了 Layer I 、 Layer II 和 Layer III 共三种可选的音频压缩标准, MPEG-2 又进一步引入了 AAC ( Advanced Audio Coding )音频压缩标准, MPEG-4 标准中的音频部分则同时支持合成声音编码和自然声音编码等不同类型的应用。在这许多音频压缩标准中,声名最为显赫的恐怕要数 MPEG-1 Layer III ,也就是我们常说的 MP3 音频压缩标准了。从 MP3 播放器到 MP3 手机,从硬盘上堆积如山的 MP3 文件到 Internet 上版权纠纷不断的 MP3 下载, MP3 早已超出了数据压缩技术的范畴,而成了一种时尚文化的象征了。
很显然,在多媒体信息日益成为主流信息形态的数字化时代里,数据压缩技术特别是专用于图像、音频、视频的数据压缩技术还有相当大的发展空间——毕竟,人们对信息数量和信息质量的追求是永无止境的。 从信息熵到算术编码,从犹太人到 WinRAR ,从 JPEG 到 MP3 ,数据压缩技术的发展史就像是一个写满了“创新”、“挑战”、“突破”和“变革”的羊皮卷轴。也许,我们在这里不厌其烦地罗列年代、人物、标准和文献,其目的只是要告诉大家,前人的成果只不过是后人有望超越的目标而已,谁知道在未来的几年里,还会出现几个 Shannon ,几个 Huffman 呢?
谈到未来,我们还可以补充一些与数据压缩技术的发展趋势有关的话题。
1994年, M Burrows 和 D J Wheeler 共同提出了一种全新的通用数据压缩算法。这种算法的核心思想是对字符串轮转后得到的字符矩阵进行排序和变换,类似的变换算法被称为 Burrows-Wheeler 变换,简称 BWT 。与 Ziv 和 Lempel 另辟蹊径的做法如出一辙, Burrows 和 Wheeler 设计的 BWT 算法与以往所有通用压缩算法的设计思路都迥然不同。如今, BWT 算法在开放源码的压缩工具 bzip 中获得了巨大的成功, bzip 对于文本文件的压缩效果要远好于使用 LZ 系列算法的工具软件。这至少可以表明,即便在日趋成熟的通用数据压缩领域,只要能在思路和技术上不断创新,我们仍然可以找到新的突破口。
分形压缩技术是图像压缩领域近几年来的一个热点。这一技术起源于 B Mandelbrot 于 1977 年创建的分形几何学。 M Barnsley 在 20 世纪 80 年代后期为分形压缩奠定了理论基础。从 20 世纪 90 年代开始, A Jacquin 等人陆续提出了许多实验性的分形压缩算法。今天,很多人相信,分形压缩是图像压缩领域里最有潜力的一种技术体系,但也有很多人对此不屑一顾。无论其前景如何,分形压缩技术的研究与发展都提示我们,在经过了几十年的高速发展之后,也许,我们需要一种新的理论,或是几种更有效的数学模型,以支撑和推动数据压缩技术继续向前跃进。
人工智能是另一个可能对数据压缩的未来产生重大影响的关键词。既然 Shannon 认为,信息能否被压缩以及能在多大程度上被压缩与信息的不确定性有直接关系,假设人工智能技术在某一天成熟起来,假设计算机可以像人一样根据已知的少量上下文猜测后续的信息,那么,将信息压缩到原大小的万分之一乃至十万分之一,恐怕就不再是天方夜谭了。
回顾历史之后,人们总喜欢畅想一下未来。但未来终究是未来,如果仅凭你我几句话就可以理清未来的技术发展趋势,那技术创新的工作岂不就索然无味了吗?依我说,未来并不重要,重要的是,赶快到 Internet 上下载几部大片,然后躺在沙发里,好好享受一下数据压缩为我们带来的无限快乐吧。
哈夫曼
哈夫曼编码是无损压缩当中最好的方法。它使用预先二进制描述来替换每个符号,长度由特殊符号出现的频率决定。常见的符号需要很少的位来表示,而不常见的符号需要很多为来表示。
哈夫曼算法在改变任何符号二进制编码引起少量密集表现方面是最佳的。然而,它并不处理符号的顺序和重复或序号的序列。
21 原理
我不打算探究哈夫曼编码的所有实际的细节,但基本的原理是为每个符号找到新的二进制表示,从而通常符号使用很少的位,不常见的符号使用较多的位。
简短的说,这个问题的解决方案是为了查找每个符号的通用程度,我们建立一个未压缩数据的柱状图;通过递归拆分这个柱状图为两部分来创建一个二叉树,每个递归的一半应该和另一半具有同样的权(权是 ∑ N K =1 符号数 k , N 是分之中符号的数量,符号数 k 是符号 k出现的次数 )
这棵树有两个目的:
1. 编码器使用这棵树来找到每个符号最优的表示方法
2. 解码器使用这棵树唯一的标识在压缩流中每个编码的开始和结束,其通过在读压缩数据位的时候自顶向底的遍历树,选择基于数据流中的每个独立位的分支,一旦一个到达叶子节点,解码器知道一个完整的编码已经读出来了。
压缩后的数据流是 24 位(三个字节),原来是 80 位( 10 个字节)。当然,我应该存储哈夫曼树,这样解码器就能够解码出对应的压缩流了,这就使得该例子中的真正数据流比输入的流数据量大。这是相对较短的数据上的副作用。对于大数据量来说,上面的哈夫曼树就不占太多比例了。
解码的时候,从上到下遍历树,为压缩的流选择从左 / 右分支,每次碰到一个叶子节点的时候,就可以将对应的字节写到解压输出流中,然后再从根开始遍历。
22 实现
哈夫曼编码器可以在基本压缩库中找到,其是非常直接的实现。
这个实现的基本缺陷是:
1. 慢位流实现
2. 相当慢的解码(比编码慢)
3. 最大的树深度是 32 (编码器在任何超过 32 位大小的时候退出)。如果我不是搞错的话,这是不可能的,除非输出的数据大于 2 32字节。
另一方面,这个实现有几个优点:
1. 哈夫曼树以一个紧密的形式每个符号要求 12 位(对于 8 位的符号)的方式存储,这意味着最大的头为 384 。
2. 编码相当容易理解
哈夫曼编码在数据有噪音的情况(不是有规律的,例如 RLE )下非常好,这中情况下大多数基于字典方式的编码器都有问题。
LZ78是每读入一个字符的同时,将其编入自己的字典,然后,再读入字符的同时,则在已有的字典里查找,没有的话该字符就在新编入辞典。如此循环。
LZW是先建立了ASCII码的字典,这样就事先花费了8个字节(256个ASCII码)的存储空间,然后再像LZ78一样读入字符,没有的再进行编入字典,如此循环。
计算机如何显示一张图像的:
不同格式的压缩方式是不同的。
bmp文件
bmp(bitmap的缩写)文件格式是windows本身的位图文件格式,所谓本身是指windows内部存储位图即采用这种格式。一个bmp格式的文件通常有bmp的扩展名,但有一些是以rle为扩展名的,rle的意思是行程长度编码(runlengthencoding)。这样的文件意味着其使用的数据压缩方法是bmp格式文件支持的两种rle方法中的一种。
bmp文件可用每象素1、4、8、16或24位来编码颜色信息,这个位数称作图象的颜色深度,它决定了图象所含的最大颜色数。一幅1-bpp(位每象素,bitperpixel)的图象只能有两种颜色。而一幅24-bpp的图象可以有超过16兆种不同的颜色。
下一页的图说明了一个典型bmp文件的结构。它是以256色也就是8-bpp为例的,文件被分成四个主要的部分:一个位图文件头,一个位图信息头,一个色表和位图数据本身。位图文件头包含关于这个文件的信息。如从哪里开始是位图数据的定位信息,位图信息头含有关于这幅图象的信息,例如以象素为单位的宽度和高度。色表中有图象颜色的rgb值。对显示卡来说,如果它不能一次显示超过256种颜色,读取和显示bmp文件的程序能够把这些rgb值转换到显示卡的调色板来产生准确的颜色。
bmp文件的位图数据格式依赖于编码每个象素颜色所用的位数。对于一个256色的图象来说,每个象素占用文件中位图数据部分的一个字节。象素的值不是rgb颜色值,而是文件中色表的一个索引。所以在色表中如果第一个r/g/b值是255/0/0,那么象素值为0表示它是鲜红色,象素值按从左到右的顺序存储,通常从最后一行开始。所以在一个256色的文件中,位图数据中第一个字节就是图象左下角的象素的颜色索引,第二个就是它右边的那个象素的颜色索引。如果位图数据中每行的字节数是奇数,就要在每行都加一个附加的字节来调整位图数据边界为16位的整数倍。
并不是所有的bmp文件结构都象表中所列的那样,例如16和24-bpp,文件就没有色表,象素值直接表示rgb值,另外文件私有部分的内部存储格式也是可以变化的。例如,在16和256色bmp文件中的位图数据采用rle算法来压缩,这种算法用颜色加象素个数来取代一串颜色相同的序列,而且,windows还支持os/2下的bmp文件,尽管它使用了不同的位图信息头和色表格式。
pcx文件
pcx是在pc上成为位图文件存储标准的第一种图象文件格式。它最早出现在zsoft公司的paintbrush软件包中,在80年代早期授权给微软与其产品捆绑发行,而后转变为microsoftpaintbrush,并成为windows的一部分。虽然使用这种格式的人在减少,但这种带有pcx扩展名的文件在今天仍是十分常见的。
pcx文件分为三部分,依次为:pcx文件头,位图数据和一个可选的色表。文件头长达128个字节,分为几个域,包括图象的尺寸和每个象素颜色的编码位数。位图数据用一种简单的rle算法压缩,最后的可选色表有256个rgb值,pcx格式最初是为cga和ega来设计的,后来经过修改也支持vga和真彩色显示卡,现在pcx图象可以用1、4、8或24-bpp来对颜色数据进行编码。
tiff文件
pcx格式是所有位图文件格式中最简单的,而tiff(taggedimagefileformat)则是最难的一种。
tiff文件含有tif的扩展名。它以8字节长的图象文件头开始(ifh),这个文件头中最重要的成员是一个指向名为图象文件目录(ifd)的数据结构的指针。ifd是一个名为标记(tag)的用于区分一个或多个可变长度数据块的表,标记中含有关于图象的信息。tiff文件格式定义70多种不同类型的标记,有的用来存放以象素为单位的图象宽度和高度,有的用来存放色表(如果需要的话),当然还必须有用来存放位图数据的标记,一个tiff格式文件完全为它的标记所决定,而且这种文件结构极易扩展,因为你要附加一些特征只须增加一些额外的标记。
究竟是什么使tiff文件如此复杂?一方面,要写一种能够识别所用不同标记的软件非常困难。大多数tiff的阅读程序只能识别一部分标记,所以会出现这种情况:有时一个应用程序创建的tiff文件,另一个应用程序却不能使用。创建tiff文件的程序还可能会在文件中加一些只有它自己认识的标记,虽然tiff的阅读程序可以跳过那些它们不认得的标记,但这样做总是有可能影响到图象的质量。
另一方面,一个tiff文件可以包含多个图象,每个图象都有自己的ifd和一系列标记。tiff文件中的位图数据可能会用好几种方法来压缩,所以一个完备的tiff阅读程序应该有rle解压缩程序,lzw解压缩程序和其他一些算法的解压缩程序。然而更糟的是使用lzw的解码必须得到unisys公司的同意,且通常是需要付版税的。所以即使是一些相当不错的tiff阅读程序在它们遇到lzw算法压缩的图象时也是无能为力的。
尽管tiff是那么的复杂,但仍是一种最好的跨平台格式。因为它非常灵活,无论在视觉上还是其他方面,都能把任何图象编码成二进制形式而不丢失任何属性。
gif文件
当许多图象方面的权威一想到lzw的时候,他们也会想到gif(graphicsinterchangeformat,读作jiff)这是一种常用的跨平台的位图文件格式,最初为compuserve公司所创。gif文件通常带有gif的扩展名,而且在compuseve上大量存在。
gif文件的结构取决于它属于哪一个版本,目前的两种版本分别是gif87a和gif89a,前者较简单。无论是哪个版本,它都以一个长13字节的文件头开始,文件头中包含判定此文件是gif文件的标记、版本号和其他的一些信息。如果这个文件只有一幅图象,文件头后紧跟一个全局色表来定义图象中的颜色。如果含有多幅图象(gif和tiff格式一样,允许在一个文件里编码多个图象),那么全局色表就被各个图象自带的局部色表所替代。
在gif87a文件中,文件头和全局色表之后是图象,它可能会是头尾相接的一串图象中的第一个,每个图象由三部分组成,一个10字节长的图象描述,一个可选的局部色表和位图数据。为有效利用空间,位图数据用lzw算法来压缩。
gif89a结构与此类似,但它还包括可选的扩展块来存放每个图象的附加信息。gif89a详细定义了四种扩展块:图象控制扩展块,它用来描述图象怎样被显示(例如,显示是应该象一个透明物去覆盖上一个图象,还是简单的替换它);简单文本扩展块,它包含显示在图象中的文本;注释扩展块,它以ascii文本形式存放注释;应用扩展块,它存放生成该文件的应用程序的私有数据。这些扩展块可以出现在文件中全局色表的任何地方。
gif最显著的优点是它的广泛使用和它的紧密性。但它有两个弱点,一个是用gif格式存放的文件最多只能含有256种颜色。另一个可能更重要,就是那些使用了gif格式的软件开发者必须征得compuserve的同意,他们每卖出一个拷贝都要向compuserve付版税。这个政策是compuserve仿效unisys公司作出的,它抑制了那些程序员在他的图象应用程序中支持gif文件。
png文件
png(portablenetworkgraphic,发音做ping)文件格式是作为gif的替代品开发的,它能够避免使用gif文件所遇到的常见问题。它从gif那里继承了许多特征,而且支持真彩色图象。更重要的是,在压缩位图数据时它采用了一种颇受好评的lz77算法的一个变种,lz77则是lzw的前身,而且可以免费使用。由于篇幅所限,在这里就不花时间来具体讨论png格式了。
jpeg文件
jpeg(jointphotographicexpertsgroup,发音做jay-peg)文件格式最初由c-cubemicrosystems推出,是为了提供一种存储深度位象素的有效方法,例如对于照片扫描,颜色很多而且差别细微(有时也不细微)。jpeg和这里讨论的其他格式的最大区别是jpeg使用一种有损压缩算法,无损压缩算法能在解压后准确再现压缩前的图象,而有损压缩则牺牲了一部分的图象数据来达到较高的压缩率。但是这种损失很小以至于人们很难察觉。
jpeg图象压缩是一个复杂的过程,经常需要专门的硬件来帮助。首先图象以象素为单位分成88的块。然后,每个块分三个步骤被压缩。第一步使用dct(discretecosinetransform)离散余弦变换把88的象素矩阵变成88的频率(也就是颜色改变的速度)矩阵。第二步对频率矩阵中的值用量化矩阵进行量化,滤掉那些总体上对图象不重要的部分。第三步,也就是最后一步,对量化后的频率矩阵使用无损压缩。
因为被量化后的频率矩阵缺了许多高频信息,通常能被压缩到一半甚至更少。无损压缩一般根本不能压缩真正的照片图象,所以50%的压缩率已是相当不错了,但另一方面,无损压缩能把一些图象文件尺寸减少90%,这样的图象文件就不适合用jpeg来压缩。
jpeg的有损部分产生在第二步,量化矩阵的值越高,从图象中丢掉的信息就越多,从而压缩率就越高,可是同时图象的质量就越差。在jpeg压缩时可以选择一个量化因子,这个因子的值决定了量化矩阵中的数值。理想的量化因子要在压缩率和图象质量间达到平衡,所以对不同的图象要选择不同的量化因子,通常要经过若干次尝试后方可确定。
以上就是关于PNG、JPEG、BMP等几种图片格式详解(四)—— GIF全部的内容,包括:PNG、JPEG、BMP等几种图片格式详解(四)—— GIF、zip 的压缩原理与实现、压缩壳的压缩原理等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)