购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.3.2 图形文件的压缩及数据存储

数据图像是通过什么样的机制在计算机屏幕上显示出来的呢?在计算机中设置了专门用于存储图形(图像)信息的帧缓存存储器,如果这个存储器内填充了图像数据,那么这些数据就会自动地由光栅扫描方式映射到屏幕上,从而形成图像。帧缓存存储器中的每一位对应屏幕上的一个点,当该位上的数据是1时,屏幕上对应的位置就会出现一个亮点;当该位上的数据是0时,屏幕上对应的位置就是一个暗点。当计算机启动时,帧缓存中的所有位都被置为0,只有在输入了图形或图像数据之后,帧缓存中的某些位置才被置换为1。例如,在显示器的分辨率为640×480的计算机中,要显示一幅二值图像(每个像素占1 bit)需要占用640×480位的帧缓存容量,我们把这个容量称为一个位平面。要显示一幅灰度级为256的图像就要配置8个位平面,即需要640×480字节的帧缓存。随着显示器分辨率的增大所需要的帧缓存容量也要求相应增大。这是针对单色图像来说的。如果要显示R、G、B均为256个灰度级的彩色图像,那么帧缓存的容量要扩大到上述容量的3倍才可以。当我们自由地选用显示器的分辨率时,我们必须要考虑计算机内现存的帧缓存容量的容许范围。例如,当现存的帧缓存为512kB(1kB=1024字节)时,若要显示灰度级为256的单色图像,我们最大限度地只能使用800×600的分辨率。假如选用了1024×768分辨率时,图像的灰度就会降到16个等级(4bits)。当然,我们不是没有办法的,我们可以通过增加帧缓存的容量来获取更大的分辨率,但我们必须注意显示器自身的能力范围。当显示器不具备显示较高分辨率的能力时,也仍然不能得到想要的较高分辨率。

知道帧缓存的作用之后,我们就能够通过直接向帧缓存内填写图形(图像)数据来显示图像了。最简单的例子是显示一幅二值图像,只需要填充一个位平面。在应用MS-DOS操作系统的许多计算机中,有一个被称为VRAM的缓存区,该缓存区的地址是随着机型的不同而不同的。例如在NEC-9801系列微机中,VRAM位于标准内存的A8000-BFFFF和E0000-EFFFF的地址上,总共占用了128kB。由于NEC-9801微机采用的是640×400的分辨率,所以它的一幅帧缓存的容量是32kB。128kB的VRAM刚好容纳4幅帧缓存,也即在它的VRAM中可以同时容纳4幅不同的二值图像。若有一幅640×400的二值图像的数据,我们从A8000首地址开始向后按顺序填写,该图就会立刻在显示器中显示出来。

需要注意的是,虽然二值图像每一个像素上的数据,在帧缓存上都是以位(bit)为单位来描述的,但计算机中输入、输出的数据都是以字节(byte)为单位的。因此图像数据中的每一个字节对应画面上横排的8个像素。

由此可看出,记录图像所需的数据量是十分庞大的,这对于图像的存储、传送和处理来说都是极不方便的。为了减少数据存储量,减少传送和处理的时间,就必须对图形(图像)数据进行压缩处理。有多种压缩技术可以减少图像文件的字节数,但是某种特定压缩方法的效果取决于图像的类型。在图像文件中寻找模式的简单方法最适用于包含大范围单色区域的设计方案,而更为复杂的压缩方案在处理真实感计算机图像和数字照片的效果会更好。一般可采用减少占据字节的编码来代替颜色值的方法减小图形文件的尺寸。除此之外,压缩文件中还包含用于指明图像扫描线末尾或图像文件末尾的代码。有些使用浮点运算的压缩方法可能会产生取整误差,使用拟合的方法也会改变图像的颜色。不改变图像文件值的压缩方法称为无损压缩,而产生颜色变化的方法称为有损压缩。在很多情况下,有损压缩法可以达到更高的压缩比(原始文件的字节数与压缩文件的字节数的比值)。3种压缩方法如下。

(1)LZW编码 由Lempel、Ziv和Welch开发的LZW算法是早期的模式识别算法LZ、LZ77和LZ78的改进,LZW算法用一个代码来替换图像文件中的重复模式。例如,在序列{125,90,20,300,11,125,90,49,212,20,300,11,…}中,模式{125,90}和{20,300,11}出现了两次,如果用代码a1和a2分别代替这两个模式,并用代码a3代替剩下的模式{49,212},就可以将原来12个字节的输入编码缩为5个字节的序列{a1,a2,a1,a3,a2,…}。或者不重复的模式,如{49,212},可以不用代码来代替而直接存储在压缩文件中。

LZW算法搜索重复序列,并且构造一张与该序列对应代码的表,根据此代码表解码压缩文件。因此,该编码方法称为替代算法(Substitutional Algorithm)和基于字典的算法(Dictionary-Based Algorithm)。

(2)行程编码 该方法是在图像文件中搜索连续、重复的值,然后将一串重复的值存储为重复的次数和该值,从而减小文件尺寸。例如,如果100在一条扫描线上连续重复7次,在压缩文件中存储两个值:7和100。这将原先需要7个字节存储减少为仅仅需要2个字节存储。对于包含大范围单色区域的图像,这种编码十分有效。但如果是在数字照片等具有频繁颜色变换、很少连续重复值的图像中,很多颜色值的重复次数只有1。

有很多种对基本行程编码方法的改进方法可以提高编码效率。例如,可以用负数来指出一串不重复的值,而不用为它存储重复次数1。因此,对于队列{10,10,10,10,66,87,23,30,30,30,30,30,30,30,…}编码为{4,10,-3,66,87,23,7,30,…}。编码后的队列表示10出现4次,然后是3个不重复的值66、87和23,接着是30出现了7次。因此,原来的14个字节的输入被压缩为8个字节。

(3)算术编码 该方法是根据文件中的频率计数产生值序列的数值代码。首先计算每个值在文件中所占的比例,这在从0.0~1.0的单位区间内划分出了一组子区间。然后,反复映射每个文件片段到这些子区间上,从而建立不同文件值组合的数值区间。子区间的数值边界就用来编码这些值的组合。例如,假若有一个具有100个序列但只有3个不同的值的文件。表2-5给出了这3个值对应的频率计数和在文件中的比例。

表2-5 值的频率计数和出现比例

F 1 对应从0.00到0.20的子区间,值 F 2 对应从0.20到0.50的子区间,值 F 3 对应从0.50到1.00的子区间,即20%的单位区间与 F 1 关联,30%的单位区间与 F 2 关联,50%的单位区间与 F 3 关联。如果把 F 1 映射到 F 3 子区间,将占单位区间上半段的20%。这个从0.50到0.60的子区间代表了 F 3 F 1 。类似可得将 F 2 F 3 映射到 F 3 的结果,如表2-6所示。如此继续将两个值的序列的区间映射到其他区间上,可得到更长的值序列。子区间的边界值用于编、解码值序列。

表2-6 以 F 3 开始的所有的两个值的序列在单位区间上的范围

有很多方法可以终止单位区间的细分,并且为值的组合分配代码。算数编码方法通常用二进制数实现,而不是用单位区间内的浮点值。因此,压缩文件是一个二进制数的序列。 j1vvB2k5jN6kP7L7XTaEwn/E+ZhiY9EOKdkD0ZNBs0HjqCgr1iTVleXSI/77HvX3

点击中间区域
呼出菜单
上一章
目录
下一章
×