# 图形文件的显示

[ 主页 ] [上一层]

当白光通过棱镜折射时，它的色彩成份分离形成色彩排列，这是白光的光谱特点，并且色彩范围人眼都能看见的。形成光谱的色彩顺序是红色、橙色、黄色、绿色、蓝色、青色和紫色，按首字母缩写成ROYCBIV（最初把青色包括进去似乎为了使这个缩写能发音）。因为在光谱色彩中，基本色是红色、绿色和蓝色，所以光的色彩模式归结成RGB模式，和以前一样进行讨论。
因为非白色光是有色的，会漏掉总光谱中的口部分，所以每种非白色光都折射自己本身的光谱。
尽管白色在CYM模型中是色素的缺乏（被画布白色代替）。但在RGB模型中黑色则是各种光的缺乏（被认为是真正的黑色）。三种基本光混合形戍白光。当三种基本光与其它每一种光混合时，形成淡青色、洋红色和黄色以及CMY颜色模式的原颜色。
对于充分理解和掌握物质是如何在各种光的条件下显示的，光和颜色间的差别是一个重要概念，它们是对立的，然而又互辅相成。一个主模式补充其分模式。RGB发射光，而CYM反射光。如果没有光的照射，就不能看见物体的颜色，而有色光必须照在不透明的表面上才能看见。混合所有色彩光形成白色，而混合所有色素色彩形成黑色。最后，RGB通过增加进行混合，而CYM通过减少进行混合。
光的三个重迭聚光点说明了这个基本模式。这里，色彩中没有黑 是由红、绿、蓝三种原色产主的。由于光的混合，形成了淡青色，洋红色和黄色。同时观察这两种模式，可见，RGB模式是CMY模式的对立物， 就像每一种主体部分都是另一种的从属部分。
利用红（Red）、蓝（Blue）和绿（Green）种基本颜色，可以配制出绝大部分肉眼能看到的颜色。像彩色电视机的显像管（CRT）以及计算机屏幕，都是以这种方式来混合出各种不同的颜色效果。 RGB模式的混色原理是以颜色加法来混合出各种不同的颜色。
白色光也是由三中原色：红、绿、蓝混合而成的。光谱中原色互补色是青蓝色、品红色和黄色。所以用这三种原色构成所有颜色。这三种原色构成了CYM色彩模式。在CYM色彩模式中，红色是品红色与黄色混合而成，蓝色是青蓝色与品红色混合而成的，而大多数人所认为的黄色总是带点品红色。CYM色彩模式步流行的原因之一是这些深色的原色是不自然的，而且不容易得到。自然界中真正的原色是很少的。
在理论上，利用C、M、Y三种基本色便可以混合为黑色，但是由于考虑到印刷油墨混合的误差，所以有必要再加进一定量的黑色。但使用CYM的一个重要的难度是原色混在一起会产生黑色，而不是棕色。这就是为什么画家可以通过混合RGB中强烈的相邻色彩得到接近黑色的原因。
CMYK是由青（Cyan）、品红（Magenta）、黄（Yellow）以及黑（Black）四种基本色调配合成各种不同的颜色，一般应用在印刷输出的分色处理上面。
CMYK与RGB所不同的地方，除了组成的基本色不同之外，RGB的合成是采取颜色加法，而CMYK则是采用颜色减法。
Lab模式是一般人较为陌生的色彩模式，这个模式的色彩定义石油国际照明委员会CIE所制定的，也是目前所有模式中含钙色彩范围最广的模式。它的特色是对色彩的描述完全采用数学方式，与系统及设备无关，因此它可以无偏差地在系统与平台间进行转换。
Lab模式是以一个亮度分量L（Lightness）——范围是 0-100；以及两个颜色分量a与b来表示颜色。a分量是由绿色演变到红色——范围是 -120-120；而b分量则是由蓝色演变到黄色——范围是 -120-120。
人眼所能看见的光、色之范围较为广泛，由计算机的彩色屏幕按RGB模式或由彩色印刷品按CMYK模式所表示出来的光与色，只不过是其中的一部分。而且像RGB、CMYK和Lab三种模式表现的颜色范围也不相同。
HSB模式是利用色相（Hue）、色浓度（Saturation）以及亮度（Brightness）三种基本向量来表示一种颜色。
* Hue：色调，沿着色调环从0度（纯红）转变为其他颜色，再转回360度（纯红）。
* Saturation：色彩的饱和度。0 %时为灰色，100 %时为纯色。
* Brightness：亮度，0 %为黑色，100 %时为白色。
所谓的色相，指的是不同波长的光谱，例如红色和绿色便是属于不同的色相。
色浓度则是指颜色的深浅，例如同样是红色，也会因为浓度的不同而分为深红或浅红。至于亮度则指的是颜色明暗的程度。
在灰度图象中，每一个
象素都以8位元表示，因此
可以表现出256种层次。如
果将纯黑和纯白之间的层次
等分成256个层次，就成了
256灰度模式，可以用来模
拟黑白照片的图像效果。
所以每一个位元都是介
于黑色与白色之间256种灰
度的一种。灰度图象中只有灰度而没有彩色，所以除了与彩色有关的命令之外，几乎所有的功能都可以支持灰度图象。虽然黑白照片中的层次是连续的，同时层次远远超过了256个，但就一般应用美术的要求而言，256个层次已足以将黑白图像表现得相当完美了。
黑白图象是1位元的图象，也就是每个象素都由一个位元来表示，不是黑色就是白色。
它所占用的内存最小，但所支持的功能也最受限制。例如黑白图象并不能够表现出渐变的色彩。当图象从灰度转换黑白时，用户可以在对话框中选择转换成为什么样子黑白图象。
黑白模式无法表现层次复杂的图像，但可以制作黑白的线条图（Line Art），或是特殊的二层次高反差图像。
注意，其他的彩色图象并不能直接转换成为黑白图象，必须先将它转换成为灰度图象，然后才能将其转换成为黑白图象。
在RGB或是CMYK等彩色图象中，每一个象素都可以表现出完整的颜色信息，不过所占用的内存也相当大。而经过统计，一张RGB图象当中所真正使用的色彩，往往多只有几百种甚至只有几十种。所以聪明的工程师就想到，如果以这些所使用到的颜色建立一张颜色表（Color Table），而每一个象素当中的数值则表示为这个颜色表中的某个位置，那么岂不就可以节约相当多的内存吗？举例来说，一个24位RGB的图象，转变成为256色（8位每象素）的索引图象之后，所占用的内存容量只有原来的三分之一，这就是所谓的索引色的由来。
不过将图象转换成为索引色模式之后，所必须要注意的有两件事，第一是索引色图象所支持的功能比起RGB、CMYK图象来要少得多，因为索引色图象并不包含连续的色调变化所以许多的滤镜和渐变功能，多半不支持索引色图象。其次如果索引色所能表现的颜色数目，远少于原来图象中的颜色种类时，便会在原本平滑的图象表面，造成边缘效应，从以下的图象当中可以发现，随着位数的减少，边缘效应也愈加明显。所以除非特殊需要或是万不得已，否则我们还是用RGB、Lab或是CMYK模式来处理图象。
一般工业上的标准是以CMYK四种油墨来印刷彩色出版物。但我们身边的许多印刷物，例如名片，往往只需要用到两种油墨的颜色就可以表现出彩色效果。如果并不需要全彩色的印刷质量，这时我们便可以考虑利用双色印刷来节省成本。
另一方面，虽然我们在图象当中每一种油墨都可以指定256种不同的灰度阶层，但是在实际的印刷机上，机器所能分辨的压力强弱却不超过50种。所以当我们要印出灰度要求较细密的图象时，也可以利用双色印刷，指定其中一种油墨为黑色，另一种则为较淡的灰色，以此印出灰度层次较密的出版物。
除Duotone模式之外，用户也可以选择Monotone（单色）、Tritone（三色）以及Quadtone（四色）等不同的方式，以产生特殊的印刷设计效果。
在彩色显示设备所能显示的彩色数目有限的情况下，要显示由多种彩色的图像就需要使用其他技术，其中常用的一种就是彩色抖动。彩色抖动的工作原理与黑白抖动的工作原理相同。它们的基本思想是通过牺牲空间分辨率来换取灰度或彩色分辨率。假设用4个象素表示一个大象素，那么如果原来只有两种彩色，现在就有多种彩色。当然这里的多种彩色是一种“错觉”，因为其他彩色是两种原色的象素按一定规则排列而得到。
行程长度压缩
原理是将一扫描行中的颜色值相同的相邻像素用一个计数值和那些像素的颜色值来代替。例如:aaabccccccddeee，则可用3a1b6c2d3e来代替。对于拥有大面积，相同颜色区域的图像，用RLE压缩方法非常有效。由RLE原理派生出许多具体行程压缩方法:
1．PCX行程压缩方法:
该算法实际上是位映射格式到压缩格式的转换算法，该算法对于连续出现1次的字节Ch，若Ch>0xc0则压缩时在该字节前加上0xc1，否则直接输出Ch，对于连续出现N次的字节Ch，则压缩成0xc0＋N，Ch这两个字节，因而N最大只能为ff－c0=3fh(十进制为63)，当N大于63时，则需分多次压缩。
2．BI_RLE8压缩方法:
在WINDOWS 3．0、3．1的位图文件中采用了这种压缩方法。该压缩方法编码也是以两个字节为基本单位。其中第一个字节规定了用第二个字节指定的颜色重复次数。如编码0504表示从当前位置开始连续显示5个颜色值为04的像素。当第二个字节为零时第二个字节有特殊含义:0表示行末；
1表示图末；2转义后面2个字节，这两个字节分别表示一像素相对于当前位置的水平位移和垂直位移。这种压缩方法所能压缩的图像像素位数最大为8位(256色)图像。
3．BI_RLE压缩方法:
该方法也用于WINDOWS 3．0/3．1位图文件中，它与BI_RLE8编码类似，唯一不同是:BI_RLE4的一个字节包含了两个像素的颜色，因此，它只能压缩的颜色数不超过16的图像。因而这种压缩应用范围有限。
4．紧缩位压缩方法(Packbits):
该方法是用于Apple公司的Macintosh机上的位图数据压缩方法，TIFF规范中使用了这种方法，这种压缩方法与BI_RLE8压缩方法相似，如1c1c1c1c2132325648压缩为:831c2181325648，显而易见，这种压缩方法最好情况是每连续128个字节相同，这128个字节可压缩为一个数值7f。这种方法还是非常有效的。
霍夫曼编码压缩也是一种常用的压缩方法。是1952年为文本文件建立的，其基本原理是频繁使用的数据用较短的代码代替，很少使用的数据用较长的代码代替，每个数据的代码各不相同。这些代码都是二进制码，且码的长度是可变的。如:有一个原始数据序列， ABACCDAA则编码为A(0)，B(10)，C(110)，D111)，压缩后为010011011011100 。 产生霍夫曼编码需要对原始数据扫描两遍，第一遍扫描要精确地统计出原始数据中的每个值出现的频率，第二遍是建立霍夫曼树并进行编码，由于需要建立二叉树并遍历二叉树生成编码，因此数据压缩和还原速度都较慢，但简单有效，因而得到广泛的应用。
LZW压缩技术比其它大多数压缩技术都复杂，压缩效率也较高。其基本原理是把每一个第一次出现的字符串用一个数值来编码，在还原程序中再将这个数值还成原来的字符串，如用数值0x100代替字符串"abccddeee"这样每当出现该字符串时，都用0x100代替，起到了压缩的作用。至于0x100与字符串的对应关系则是在压缩过程中动态生成的，而且这种对应关系是隐含在压缩数据中，随着解压缩的进行这张编码表会从压缩数据中逐步得到恢复，后面的压缩数据再根据前面数据产生的对应关系产生更多的对应关系。直到压缩文件结束为止。LZW是可逆的，所有信息全部保留。
算术压缩方法
算术压缩与霍夫曼编码压缩方法类似，只不过它比霍夫曼编码更加有效。算术压缩适合于由相同的重复序列组成的文件，算术压缩接近压缩的理论极限。这种方法，是将不同的序列映像到0到1之间的区域内，该区域表示成可变精度(位数)的二进制小数，越不常见的数据要的精度越高(更多的位数)，这种方法比较复杂，因而不太常用。
JPEG(JointPhotographicExprertsGroup联合摄影专家组)JPEG标准与其它的标准不同，它定义了不兼容的编码方法，在它最常用的模式中，它是带失真的，一个从JPEG文件恢复出来的图像与原始图像总是不同的，但有损压缩重建后的图像常常比原始图像的效果更好。JPEG的另一个显著的特点是它的压缩比例相当高，原图像大小与压缩后的图像大小相比，比例可以从1 ％到80～90 ％不等。这种方法效果也好，适合多媒体系统。
这里我们来看一下这个压缩Gif文件的LZW算法:
/* LZW.C
void PackGif(FILE *fp,char far *ImageData,
unsigned int width,unsigned int depth,int BitsPerPixel)
{kk1}
register int i,j;
unsigned char ThisChar;
int code;
char far *bitmap = ImageData;
index = 1;
pixmask = 0xff;
remcnt = 0;
rem = 0;
InitCnt = 0;
First_Char = BitsPerPixel;
CLEAR = 1 << BitsPerPixel; . //256,16,or 4
EOI = CLEAR + 1;
oldcode = -1;
memset( CTfirst,0,4096 );
memset( CTlink,0,8192 );
memset( CTnext,0,8192 );
PackInit( CLEAR );
PutCode( fp,CLEAR );
for( i=0;i<depth;i++ )
{kk1}
for( j=0;j<width;j++ )
{kk1}
ThisChar = bitmap[j];
code = LookupCT(oldcode,ThisChar);
if( code != -1)
oldcode = code;
else{kk1}
PutCode( fp,oldcode );
oldcode = (int) ThisChar;
}
if (nextcode>nextlim)
{kk1} if (reqcnt==12)
{kk1}
PutCode( fp,oldcode );
PutCode( fp,CLEAR ); /* Position */
PackInit(CLEAR); }
else {kk1} reqcnt ++;
nextlim = nextlim << 1;
if (reqcnt==12) nextlim--;
} } }
bitmap = farptr( bitmap,(long)width ); }
PutCode( fp,oldcode );
PutCode( fp,EOI );
Flush( fp );
fputc( 0,fp );
fputc( 0x3b,fp );
return ;
}
返回到上面