位图文件内部初探
当前位置:以往代写 > C/C++ 教程 >位图文件内部初探
2019-06-13

位图文件内部初探

位图文件内部初探

副标题#e#

最常用的几种图象文件名目奈何存储图象自从我在十四年前买回第一台pc今后,我就一直对计较机用1和0构成的数据流来存储那些巨大的信息很感乐趣。最初引起我留意的是其时曾很风行的印在杂志上的basic措施清单,它们带有很大都据段,你可将它们键入并运行,以成立其他的措施。从这里我大白了任何措施无论它何等巨大,也只不外是一系列的针对计较机微处理惩罚器的指令罢了。接着,我对ascii码有了乐趣,然后是字处理惩罚文件名目,再厥后吗,您就看到了图象。

直至本日仍让我沉迷的一种技能是位图文件存储。一个位图存储了计较机上可以或许再现一幅图象所需的信息。我们常常在显示器上看到图象,譬喻一幅瑰丽的日落,然而在计较机眼里它只是一堆0和1的组合。归根结底,也就是位图文件里的这些位和字节来汇报计较机这幅图象中每个象素该是什么颜色,然后计较机把位图中的颜色转化成与它的显示卡兼容的名目,最后输出到显示器上。

这个进程中有趣的是计较机奈何表明位图中的数据,位图文件有多种名目,每种名目都有本身的要领工具素数据编码并给出此种名目所要求的一些其他信息,之所以windows95可以或许读取.bmp文件而不能读.gif文件,就是因为他的设计人员使paint措施可以或许对以.bmp名目存储的图象数据举办解码,而不是.gif。

到这里。您必然很想知道一个位图文件里毕竟是什么,一种名目同另一种又有什么差异?那么就让我们来简朴地看看在pc机上常用的六种位图文件名目。虽然尚有其他的文件名目,譬喻对付矢量图形,就是存储一些再现图象的指令而不是每个象素的颜色数据,可是在这里接头的这六种位图文件名目才是您平时事情最大概利用的。

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)则是最难的一种。

#p#分页标题#e#

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是那么的巨大,但仍是一种最好的跨平台名目。因为它很是机动,无论在视觉上照旧其他方面,都能把任何图象编码成二进制形式而不丢失任何属性。


#p#副标题#e#

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文件

#p#分页标题#e#

jpeg(jointphotographicexpertsgroup,发音做jay-peg)文件名目最初由c-cubemicrosystems推出,是为了提供一种存储深度位象素的有效要领,譬喻对付照片扫描,颜色许多并且不同细微(有时也不细微)。Jpeg和这里接头的其他名目标最大区别是jpeg利用一种有损压缩算法,无损压缩算法能在解压后精确再现压缩前的图象,而有损压缩则牺牲了一部门的图象数据来到达较高的压缩率。可是这种损失很小以至于人们很难察觉。

jpeg图象压缩是一个巨大的进程,常常需要专门的硬件来辅佐。首先图象以象素为单元分成8*8的块。然后,每个块分三个步调被压缩。第一步利用dct(discretecosinetransform)离散余弦调动把8*8的象素矩阵酿成8*8的频率(也就是颜色改变的速度)矩阵。第二步对频率矩阵中的值用量化矩阵举办量化,滤掉那些总体上对图象不重要的部门。第三步,也就是最后一步,对量化后的频率矩阵利用无损压缩。

因为被量化后的频率矩阵缺了很多高频信息,凡是能被压缩到一半甚至更少。无损压缩一般基础不能压缩真正的照片图象,所以50%的压缩率已是相当不错了,但另一方面,无损压缩能把一些图象文件尺寸淘汰90%,这样的图象文件就不适适用jpeg来压缩。

jpeg的有损部门发生在第二步,量化矩阵的值越高,从图象中丢掉的信息就越多,从而压缩率就越高,但是同时图象的质量就越差。在jpeg压缩时可以选择一个量化因子,这个因子的值抉择了量化矩阵中的数值。抱负的量化因子要在压缩率和图象质量间到达均衡,所以对差异的图象要选择差异的量化因子,凡是要颠末若干次实验后方可确定.

    关键字:

在线提交作业