图形化革命

1945年9月10日万尼瓦尔(Vannevar Bush 1890-1974)在《生活》(life)杂志中发表了一篇关于未来科学大胆猜想的文章《思维之际》(As We May Think)。文中描述了一种未来发明,这项发明可以帮助科学家和研究人员更轻松地处理日益增多的技术期刊及文章。布什提出可以利用微缩胶片作为解决方案,同时他构想出了一种叫做麦克斯存储器(Memex,又名记忆扩展器)的设备,它可以对书籍,文章,录音和图片进行保存。麦克斯存储器还有一项重要的功能,那就是它可以让用户根据某个主题在所有的素材之间建立关联,这些关联的基本来源就是我们人类视为。他还大胆预言一种新的职业群体,他们的工作就是在繁杂的信息载体之间提炼并建立起可靠的关联。

这个故事的主角是信息(Information),故事的主线是如何利用新技术成功的处理信息。

交互式

回顾历史,从第一台继电器计算器(1934)的出现到现在为止,65年过去了,计算机的体积越来越小,处理速度越来越快,价格也越来越便宜。

要充分利用日益增长的运算和处理能力,较好的一种方法就是不断改进计算机系统中的关键部位,最典型的就是用户界面(User Interface)——它可以看作人机交互的轴心。

在计算机发展的早期,交互式这个概念并没有它的实际意义。人们编程时更多使用的是开关和电缆,有一部分人使用的是打孔纸带或胶片。到了20实际50年代到60年代(有些观点认为这一时间可以延续到70年代),计算机已经可以使用批处理(batch processing)进行编程:程序和数据被“分布”在打孔卡上,然后一次性录入到计算机内存。这些工作完成之后,再由程序对数据进行分析,得出结论,最后将结果打印在纸上。

最早的交互式计算机运用的是电传打字机。我们回忆一下前面讲过的达特茅斯(Dartmouth)时分操作系统(原型出现于20世纪60年代中期),这种系统支持多个电传打字机同时工作,而且互不影响。此类系统中,用户在打字机上输入一行,计算机会相应地输出一行或多行。通常,打字机和计算机之间的信息交流是由一串ASCII码(也有可能是其他字符集)来完成的,这些ASCII码大多由字符编码组成,当然还包括像回车,换行等一系列简单的控制字符编码。随着机器的运行,相应的事务也随着打印纸的旋转逐步推进。

阴极射线管(cathode-ray tube, CRT,20世纪70年代随处可见的设备)并不受这类限制。使用软件来协调整个屏幕显得更加灵活方便——这可以算得上是一种二维的信息平台。但是为了尽可能保持操作系统显示输出的逻辑一致性,早期那些为小型计算机编写的软件都把CRT显示器看作“玻璃屏幕电传打字机”——所有内容都是一行一地显示的,当字符排到底端,屏幕被填满时,屏幕上的内容要整体向上翻滚。除了CP/M(微处理机操作系统)中的所有工具软件之外,大部分MS-DOS下的工具软件都采用这种方法——它们都仿照电传打字机的工作方式来使用视频显示器。使用电传打字机这种工作原理的操作系统有很多,或许UNIX才算是最典型的原型操作系统之一,它还保留着这种“传统工艺”。

不巧的是,ASCII码字符集不完全适用于阴极射线管的工作方式。在最原始的ASCII码设计中,编码1Bh被标识为Escape,它的主要作用是帮助字符集进行扩充。在1979年美国国家标准协会(American National Standards Institute,ANSI)发布了一项题为“ASCII码使用的附加控制(Additional Controls for Use with American National Standard Code for Information Interchange)”的标准。该标准发布的初衷是为了“适应二维字符——图像设备输入/输出控制中迫在眉睫的相关需求,其中包括阴极射线管和打印机之间的交互终端……”

其实Escape的编码1Bh只占据一个字节,且它的含义是唯一的。Escape如果作为一串序列的前缀字符,那么这串字符序列的含义也随之改变。比如下面这串序列:

1Bh 5Bh 32h 4Ah

可以看出Escape编码随后紧跟的是字符“[”“2”“J”的ASCII码,现在这一串字符的含义为“清屏”然后移动光标至左上角。这种定义在电传打字机上是不可能出现的。

下面这串序列:

1Bh 5Bh 35h 3Bh 32h 39h 48h

即Escape编码随后紧跟的是字符“[”“5”“;”“2”“9”“H”,这串字符的作用是把光标移到第5行的第29列。

键盘和CRT一起对远程计算机传输来的ASCII码(可能还包括Escape字符序列)做出响应,这种设备我们称之为哑终端(dumb terminal)。哑终端相对于电传打字机速度要更快,从某种程度来讲也更灵活,但从速度的提高程度来讲,并不足以引领用户界面的个革新。

真正的革新出现在20世纪70年代小型计算机中——它类似于第21章我们构建的假想计算机,配备了“视频显示存储器”,并作为微处理器地址空间的组成部分。

VisiCalc

第一个预示着家用计算机将与它的孪生兄弟——体积庞大,价格昂贵的大型机划分界限的标志的时间是VisiCalc的使用。VisiCalc由丹·布莱克林(Dan Bricklin,生于1951年)和鲍勃·弗兰克斯顿(Bob Frankston,生于1949年)设计并编程实现,而这套系统于1979年引入苹果II型电脑(Apple II)中。VisiCalc通过屏幕将一个二维电子数据表呈现给用户。在VisiCalc出现之前,数据表就是一张划分好了行,列的纸,主要用于一系列计算。VisiCalc用视频显示器将纸质材料取而代之,通过这种方式,用户可以在数据表中随处游走,在相应位置输入数据,公式,并在修改后对结果进行重新计算,为用户提供了更多自由。

IBM早期PC直接操控硬件输出字符

令我们惊讶与无奈的是,VisiCalc这狂应用程序无法在大型机上运行。因为像VisiCalc这类程序需要以较快的速度不断更新屏幕,所以,它们直接将数据写入Apple II视频显示器所配备的RAM中。该RAM是微处理器地址空间的一部分。大型时分计算机以及哑终端之间的接口速度过慢,以至于电子报表程序无法使用。

计算机对键盘的响应速度越快,对视频显示器的更新速度越快,则人机交互就越频繁。在IBM PC机出现的头10年(20世纪80年代),为它编写的大多数软件是直接写入显示存储器的。由于IBM建立了一套硬件标准,其他计算机厂商追随这一标准,使得软件厂商可以绕过操作系统直接使用硬件而不用担心他们的软件在某些机器上不能正确运行(或根本不能运行)。

IBM PC所使用的早期的应用程序大多数只有字符输出而没有图形输出。使用字符输出同样能使得应用程序的执行速度加快。如果视频显示器设计得如第21章所描述的那样,则程序只需简单地把某个字符的ASCII码写入内存就可以在屏幕上显示出该字符。使用图形视频显示的程序需要写入8个或更多的字节到内存中才能画出文本字符的图形。

SAGE到黑白显示器

从字符显示到图形显示的变化是计算机革命中极其重要的一步,然而图形方式下计算机硬件和软件的发展比文本和数字方式下计算机硬件和软件的发展要慢的多。早在1945年,冯·诺依曼就设想了一种像示波器一样的显示器,可用来使信息图形化。但是,直到20世纪50年代早期,计算机图形才开始成为现实。当时麻省理工学院(得到IBM资助)建立了林肯实验室来开发计算机,用于美国空军的空中防卫系统。该项目称为SAGE(semi-automatic-groundenvironment),有一个图形显示屏帮助操作员分析大量数据。

在SAGE这样的系统中使用的早期视频显示器不像今天我们在PC机中所用的显示器。今天普通的PC机显示器是光栅显示器。就像电视机,所有的图像由一系列水平光栅线组成,由一个电子枪射击光束很快地前后移动扫过整个屏幕形成光栅。屏幕可以看成是一个大的矩形点阵,这些点称为像素。在计算机里,一块内存专门供视频显示使用,屏幕上的每一个像素由1位或多位比特表示。这些二进制素质不仅决定了像素点的亮度,还决定了它的颜色。

例如,今天多数计算机显示器有至少水平方向640像素的分辨率,垂直方向480像素的分辨率,像素的总数是这两个数的乘积307200。如果1个像素只占用1位内存,则每个像素只局限于两种颜色,即通常的黑、白色。如,0像素为黑,1像素为白。这样的视频显示器需要307200位的内存,即38400字节。

随着可能的颜色数目的增多,每个像素需要更多的位,显示适配器也需要更多的内存。例如,每个像素可以用一个字节来编码灰度。按照这样的安排,字节00h为黑,FFh为白,之间的值代表不同的灰度。

CRT的色彩显示

CRT上的彩色由三个电子枪产生,每一个分别负责三原色红、绿、蓝中的一种(可以用放大镜来观察电视机或彩色计算机屏幕以验证它的正确性。由不同的原色组合来显示图像),红色和蓝色的组合是品红色,红色与绿色的组合是黄色,蓝色和绿色的组合是青色,三原色的组合是白色。

最简单的彩色图像显示适配器每个像素需要3位。像素可以如以下这样编码,每一个原色

比特 色彩
000
001
010 绿
011
100
101 品红
110
111

但是,这种方式只适合于简单的类似卡通画的图像。许多现实世界中的颜色都是红、绿、蓝按不同色阶(levels)组合而成的。如果用2个字节来表示一个像素,则每一个原色可分配5位(1位保留),这样可以给出红、绿、蓝三种颜色各32种不同的级别,即总共可有32768种不同的颜色。这种模式通常称作高彩色(high color)或千种颜色(thousands of colors)。

我们下面尝试一下用3个字节来表示一个像素,三原色中的每一种各占一个字节。这种编码模式使红、绿、蓝三种颜色各有256种不同的级别,这样总共有16777216种不同的颜色,通常称作全彩色(full color)或百万种颜色(millions of colors)。如果视频显示器的分辨率为水平640像素,垂直480像素,则总共需要921600字节的存储容量,即将近1M字节。

每个像素所赋予的比特数有时也称作色深(color depth)或色彩分辨率(color resolution)。颜色数与单个像素被赋予的比特数的关系如下:

如果视频适配卡配备的存储器容量有限,那么它的最大色深或色彩分辨率自然而然也受到约束。假设有一个配备了1MB存储器的视频适配卡,在每个像素被赋予3个字节的情况下分辨率可以达到640x480.如果想把分辨率提高到800x600,存储器就不足以为每个像素赋予3个字节,必须缩减到用2个字节来表示一个像素。

光笔和鼠标

尽管现在使用光栅显示器似乎是理所当然的,但在早期由于需要大量存储器,使用光栅显示器就不太实际。SAGE视频显示器是矢量显示器,比电视机更像示波器。电子枪可以定位到显示器上任何部分的点,并且直接画出直线或曲线。利用屏幕上图像的可持续性使得能用这些直线和曲线来形成最基本的画面。

支持光笔(light pen)是SAGE计算机的一大特色,操作者使用光笔可以改变显示器上的图像。光笔是特殊的设备,看起来像一只铁笔,一端连有电线。运行适当的软件后,计算机可以检测到光笔指向的屏幕位置,并随着光笔的移动而改变图像。

光笔的工作原理是什么呢?即使是技术专家,在第一次看到光笔的时候也会迷惑不解。关键在于光笔不发射(emit)光——它检测(detect)光。在CRT中(无论是用光栅还是向量显示),控制电子枪移动的电路也可以确定从电子枪射出的光何时打到光笔上,从而确定光笔正指向屏幕的什么位置。

伊凡·苏泽兰(Van Sutherland,生于1938年)是最早预见到就是啊 u 年纪发展的一个全新领域,即交互式计算的人之一。他在1963年示范了一个他为SAGE计算机开发的名为Sketchpad(画板)的具有革命性意义的图形程序。画板可以存放图像信息到存储器,并且可以把图像显示在屏幕上。另外,还可以用光笔在显示器上画图并修改,同时计算机会对光笔的轨迹一直进行跟踪。

另外一个交互式计算的设想家是道格拉斯·恩格尔巴特(Douglas Engelbart生于1925年)。他曾读过1945年万·布什(Vannevar Bush)发表的文章《As We May Think》(思维之际),并在5年后开始用一生的时间致力于研究新的计算机界面。20世纪60年代中期,当他在Sanford研究院时,他彻底重新考虑了输入设备,提出了用五股(five-pronged)的键盘(此设备没有流行)以及一个他叫作鼠标的有轮子和按钮的小设备来输入命令。鼠标现在已广泛用来移动屏幕上的指针,以选择屏幕上的对象。

Alto与图形用户界面

恰逢光栅显示器在经济上切实可行,许多早期的热衷于交互式图形计算的人们(尽管没有恩格尔巴特)也已聚集在Xerox(施乐)公司里。Xerox公司于1970年建立了PaloAlto(阿尔托研究所)研究中心(PARC),其中一项就是资助开发产品,以使得公司能进入计算机界。也许PARC最著名的设想家是阿伦·凯(Alan Kay,生于1940年),当他14岁的时候碰巧看到了罗伯特·海因莱因(Robert Heidein)的小故事里描述的万·布什(Van Bush)的微缩胶片图书馆,并已设想了一种他称为Dynabook的轻便计算机。

PARC的第一个大工程是Alto,于1972年~1973年期间设计和制造出来。按照那个年代的标准,这是一个给人深刻印象的产品。它采用落地式的系统单元,有16位处理器、2个3MB的磁盘驱动器、128KB内存(可以扩充到512KB),以及一个三个按钮的鼠标。在16位单片微处理器之前出现,Alto的处理器由大约200个集成电路组成。

Alto的视频显示器是它与众不同的地方之一。屏幕的大小和形状与一张纸差不多—8英寸宽10英寸高。它以光栅图形模式工作,有606个水平像素和808个垂直像素,这样总共489648个像素。每个像素占1位存储器,即每个像素不是黑色就是白色。用于视频显示的存储器容量是64KB,占用部分处理器的地址空间。

通过写入到视频显示存储器,软件可以在屏幕上画出图画或显示不同字体和大小的文本。通过在桌上滚动鼠标,用户可以在屏幕上定位指针,与屏幕上的对象进行交互。视频显示器并非像电传打字机那样按行显示用户输入,按行写出程序输出。视频显示器的屏幕是一个二维的、高密度的信息阵列和更直接的用户输入源。

20世纪70年代晚期,Alto所搭配的程序逐渐凸显出很多新奇有趣的特点。比如窗口中可以容纳多个程序并同时显示在屏幕上。Alto的视频图像功能使得软件从文本的束缚中摆脱出来,使其可以更加真实地反映用户的想法。图形对象(Graphical object,比如按钮,菜单,以及被称作图标的小图片)成为用户接口的一员。鼠标可以在多个窗口中进行选择,触发图形对象来执行程序功能。

软件的内涵就在于此,它的意义远不止仅有的用户接口,还包括与用户的亲密耦合。软件使得计算机所涵盖的应用领域变得更广,而不仅仅局限于简单的数字变换。软件之所以被设计出来,其最终目的是——引用道格拉斯·恩格尔巴特在1963年发表的一篇论文的标题——《为了扩展人类的智慧》(For the Augmentation of Man’s Intellect)。

PARC在Alto这个项目的开发成果预示着图形用户界面(Graphic User Interface,GUI)登上了历史的舞台。但Xerox公司并没有销售Alto(如果要销售的话,价格将在3万美元以上)。经过10多年,高售价的思想体现在一种成功的消费品上。

图形操作系统

1979年,Steve Jobs和来自苹果计算机公司的小组参观了PARC,看到的东西给他们留下了深刻的印象。但是,他们花费了三年多的时间才推出了具有图形接口的计算机,这就是1983年1月推出的不太受欢迎的Apple Lisa。而在1年以后,苹果公司就推出了很成功的Macintosh。

最初的Macintosh配备有Matorola6800微处理器、64KB的ROM、128KB的RAM、一个3.5英寸的磁盘驱动器(可以存储400KB)、一个键盘、一个鼠标和一个视频显示器。该视频显示器水平512个像素,垂直342个像素(CRT测量对角只有9英寸),总共175104个像素。每一个像素用1位内存,颜色为黑、白,这样视频显示RAM大约需要22KB。

最初的Macintosh硬件做得很好,但是很难进行变革。1984年,出现了使Mac与其他计算机完全不同的Macintosh操作系统,那时通常称作系统软件,后来称为Mac OS.

基于文本的单用户操作系统,如CP/M或MS-DOS,体积很小但是不支持扩展的应用程序接口(API)。关于这点在第22章进行过解释,在这些基本文件的操作系统中,没有为访问文件系统的应用程序提供一种渠道。Mac OS这种图形化操作系统所占的空间比前面提到的这两种要大得多,其中包含了上百个API函数,每一个函数都用其功能来命名。

像MS-DOS这样的基于字符的操作系统只需提供几个简单的API函数就能使得应用程序在屏幕上以电传打字机方式显示字符,但Mac OS这样的图形操作系统必须提供一种方法才能使得程序可以在屏幕上显示图形。从理论上来讲,可以通过实现一个API函数来完成,该函数使得应用程序可以设置某个水平和垂直坐标的像素的颜色。但是,实际证明这种方法效率不高且图形显示的速度很慢。

因而由操作系统提供完整的图形编程系统就显得非常有意义,这意味着操作系统需包含有画线、画矩形、画椭圆(包括圆)和字符的API函数。线可以由实线或虚线或点组成;矩形和椭圆可以用不同的填充模式来填充;字符可以显示成不同字体和大小并具有不同效果,如:加粗和下划线等。图形系统负责确定如何在显示器上把这些图形对象作为点阵来显示。

如果程序在图形操作系统下运行,那么它们在显示器或打印机上画图这一过程中,使用的是一套完全相同的API。正因为如此,字处理软件在屏幕上显示出的文档,与打印出来得到的纸质文档,看上去非常相似。这种特点称为“所见即所得”(简写为WYSUWYG)。

图形用户界面对用户而言是极具吸引力的,其中一个重要原因就是不同的应用程序使用着大致相同的工作原理,并且影响着用户的使用经验。这样一来,操作系统就承担起了支持API函数的重任,而应用程序就可以利用这些API函数去实现用户界面的不同组件,如按钮和菜单等。GUI不仅是一种看上去简洁友好的用户环境,对于程序员而言,它还是一种重要的开发环境。程序员在开发新一代用户界面的时候可以不用从底层开始重新编写。

Windows

在Macintosh推出之前,几家公司就已开始创建用于IBM PC及其兼容机的图形操作系统。从某种意义上来讲,Apple开发人员的工作要容易一些,因为他们硬件和软件一起设计。Macintosh系统软件只支持一种类型的磁盘驱动器,一种类型的视频显示器和两种打印机。但在PC上实现的图形操作系统需要支持许多不同的硬件。

另外,尽管IBMPC很早(1981年)就已推出了,但多数人已习惯于用他们喜好的MS-DOS应用程序且没有准备放弃它们。PC机的图形操作系统需要考虑的一个重要方面是,要使得MS-DOS应用程序的运行就像是专门为新的操作系统设计的应用程序一样。(Macintosh上就根本不能运行AppleII软件,因为它采用了不同的微处理器。)

1985年,迪吉多科研公式(Digital Research公司,CP/M的后续公司)推出了GEM(图形环境管理器);Visicorp公司(销售Visilalc的公司)推出了VisiOn;Microsoft公司发布了Windows1.0版,它很快被认为是“视窗战争”中最有可能的胜利者。然而,直到1990年3月发布Windows3.0,Windows才开始吸引大量的用户。从那时起,它的普及率不断提高。到今天,已有大约90%的微机上使用的操作系统是Windows。Macintosh和Windows除了具有相同的外在表现外,它们的API是非常不同的。

理论上讲,除了图形显示外,图形操作系统并不比字符操作系统需要更多的硬件,甚至不需要硬盘驱动器。最初的Macintosh没有,Windows1.0也不需要。Windows1.0甚至不需要鼠标,尽管每个人都认为用鼠标操作更容易一些。

软件开发

然而(这儿一点也不奇怪),随着微处理器越来越快,内存和外存越来越大,图形用户界面也越来越流行。越来越多的特点增加到图形操作系统,至使它们越来越大。今天的图形操作系统通常需要200MB的硬盘空间和32MB以上的内存.

在图形操作系统中,应用程序几乎都不使用汇编语言来开发。就拿早期的几款操作系统来看,Pascal是Macintosh下的主流开发语言。在Windows操作系统中,C语言一统江湖。还有一个不得不提到的例子,那就是PARC向我们展示的一种全新的方法。大概从1973年开始,PARC的研究员着手开始研发一种名为Smalltalk语言,这种语言嵌入了面向对象程序设计思想(Object-Oriented Programming),也就是今天的OOP。

从传统意义上来讲,高级程序设计语言会自然而然地区分代码(比如set,for,if这样的关键词开头的语句)和数据,即变量所代表的数字。这种区分毫无疑问来自于冯·诺伊曼计算机体系结构。在这样一种体系结构中,只有两种元素,一种是机器码,一种是机器码所操作的数据。

在面向对象的程序设计中,和冯·诺伊曼计算机的体系结构所不同的是,对象(object)实际上是代码和数据的组合。在对象内部,数据存储的实际方法只能通过与该对象相关联的代码才能理解。对象如果需要与其他对象通信,则通过发送或接受消息(message)来实现这一过程,比如一个对象可以通过给另一个对象发送指令来获得相应信息。

面向对象语言通常有助于编写用于图形操作系统的应用程序,因为编程人员可以用与用户感知对象的同样的方式来处理屏幕上的对象(如:窗口和按钮等)。举例来说,假设按钮是面向对象语言中的一个对象。屏幕上的按钮具备一定尺寸和位置,按钮上可以显示文本或小图标,这些都可以抽象成为与对象关联的数据。如果用户通过键盘或鼠标按下按钮,系统就会向按钮对象发送一个表示其被触发的消息,该按钮对象收到消息后就会调用与自身关联的代码进行响应。

小型计算机上最流行的面向对象语言是一种对传统的类似于ALGOL语言的扩展,C和Pascal就属于此类。由C扩展的面向对象语言就是赫赫有名的C++(我们可以回忆一下,两个加好放在一起等价于C语言中的自增操作)。C++的核心思想大部分来自贝尔电话实验室(Bell Telephone Laboratories)的贾尼·施特劳斯特卢普(Bjarne Stroustrup,生于1905年),最开始C++是作为一种转换程序,它可以把编写的程序转换成C程序(但是转换出的C程序即难看又难理解)。转换完成之后的C程序可以像普通程序一样编译。

其实,面向对象语言能做到的,传统语言也能做到。但是编成是解决问题的方式,面向对象语言使得编程人员能够考虑那些在结构上通常更好的不同的解决方法。如果你想——虽然困难重重——面向对象语言编写的一种程序,并使其在Macintosh和Windows上都可以编译后运行,这是完全可以做到的。此类程序并不直接引用API,使用的是被称为API函数的对象。Macintosh和WIndows使用两种不同的对象定义来编译程序。

许多在小型计算机上工作的编程人员已经逐渐不用命令行编译程序,而是使用集成开发环境(Integrated Development Environment,IDE)。这个环境里继承了所有需要的工具,而环境本身可以像其他图形应用程序一样运行,这样一来,就大大简化了程序开发任务。还有一种被称作可视化编成(Visual Programming)的技术被程序开发人员广泛利用,按钮及其它组件可以通过鼠标拖曳进行“排版”,从而达到在窗口交互设计的目的。

文本文件到字处理软件

在第22章中我们一起讨论过文本文件。为了方便人们阅读,这类文件仅由ASCII字符组成。我们回想一下使用基于文本的操作系统那个年代,文本文件是应用程序之间进行交流的理想媒介。它的最大优点是可检索性——程序可以检索多个文本文件,然后确定它们中是否有文件包含某一字符串。

但如果操作系统中有一种机制用来显示不同字体,大小,以及不同效果比如斜体,黑体和下划线,那么文本文件就不再适用了。很多字处理软件其实都会适用一种自己独有的二进制格式来存储文档。文本文件同样也不适用于图形信息。

但我们要清楚的是,与文本相关的信息(比如,字体及段落版式),都可以被编码,而且编码后并不影响其可读性。这种方案的关键是选用一个适当的转换字符来标识出这些信息。在Microsoft设计的富文本文件格式(rich text format,RTF)中,大括号”{“和”}”以及反斜杠”"封装了文本的各式信息,RTF也成为了应用程序间传递格式化文本的一种方法。

PostScript作为一种文本格式,将这种概念发挥到了极致。PostScript的设计者是Adobe系统的创始人之一——约翰·沃诺克(John Warnock,生于1940年)。PostScript是一种通用的图形编程语言,在2000年时主要用于高端计算机的打印机,显示字符或图形。

图元与位图

越来越好、越来越便宜的硬件导致了图形显示与个人计算机融合的直接结果。微处理器越来越快,存储器越来越便宜,视频显示器及打印机分辨率不断增加且具有更多种颜色,所有这些促进了计算机图形的使用。

计算机图形也逐步产生了两种分支——本章的前面提到过这两个词,当时是为了区分图形视频显示器——这两个分支就是矢量和光栅。

矢量图形(vector graphics)在一些算法的帮助下,利用直线,曲线及其填充区域生成图形。这也真是计算机辅助设计(Computer-Assisted Drawing,CAD)所应用的领域。矢量图形在工程和体系结构设计中有着十分重要的作用。矢量图形一般转化为图元文件(metafile)格式以存放到文件中。图元文件是由矢量图形的一系列绘制命令的集合组成的,这些命令通常已经被编码为二进制形式。

矢量图形的主要工具就是直线,曲线及填充区域。如果你想设计桥梁,使用矢量图形来实现将很简单,但如果要显示桥梁的实际结构,矢量图形就显得无能为力了。对于现实世界里的一副桥梁的整体结构图,用矢量图形来表示将会很复杂,而且困难重重。

光栅图形(也称作位图),就是为了解决这一问题应运而生的。位图(bitmap)将图像以矩阵阵列的形式进行编码,矩阵中的一个单元对应着输出设备上的一个像素点。就像视频显示器一样,位图是一种空间上的概念(可以称其具有分辨率),其图像的宽度和高度都以像素为单位来表示。位图也具备色深(也可叫做颜色分辨率/颜色深度)的概念,色深是指每一个像素被赋予的比特数。位图中每个像素被赋予的比特数相同。

尽管位图从表现形式上看是二维的,但其本身的存储形式却是一串连续的字节——通常从最顶端1行像素开始,紧跟着的是第2行,第3行,等等。

有些位图产生于图形操作系统设计的绘制程序,他们都是由某个操作者利用这些程序“手工绘制”出来的,还有一些位图是由计算机代码通过某种算法产生的。

捕捉图像

如今很多现实中的场景都利用位图来表示(比如数码照片),要把现实世界的图像输入到计算机中,可以借助一些不同的硬件,这类设备一般统称为电荷耦合器(charge-coupled device, CCD),它是一种在光照下会起电的半导体器件。每个像素都需要一个CCD单元来进行采样。

这些设别中最原始的可以算是扫描仪(scanner)了,其原理和影印机类似,都是利用一行CCD扫过需要复印的图像的表面,比如照片。由于光感度不同,不同区域CCD累计的电荷数也不同。扫描仪的配套软件将图像转换成位图存放在文件中。

视频摄像机用二维CCD单元阵列来捕捉图像。通常这些图像录制在录像磁带上。但视频输出也可以直接送到视频帧采集器(video frame grabber)去处理,它的工作原理是把模拟信号转换成像素值阵列。帧采集器可以收集通用的视频源,如录像机(Video Cassette Recorder,VCR)或激光影碟机(Laser Disc Player),甚至可以用于有线电视机机顶盒。

存储图像

最近,数字照相机价格已适合家庭购买,它看起来很像一般的照相机。但是,数字相机不用胶片,而是用CCD阵列来捕捉图像并直接存储到照相机的存储器中,然后传输存储到计算机中。

图形操作系统通常可以将位图文件以某种格式进行存储。Macintosh系统采用Paint格式,之所以叫这个名字是参考了创建这种格式的MacPaint程序(Macintosh的PICT格式同时支持位图和矢量图形,而且是它们的首选格式)。Windows里的默认的格式是BMP,位图文件通常以它作为扩展名。

数据压缩

位图文件可能很大,如果有方法可以让它们变小一些那就再好不过了。这种需求催生了计算机科学中的数据压缩(Data Compression)这一全新领域。

假设我们正在处理一幅每个像素占3位的图像,这种图像在本章前面曾讲过。这张图片上出现的画面是一片天空,一栋房子和一块草坪。因此,图片中可能有大片的蓝色和绿色。很可能位图的最上面一行出现了72个蓝色像素。如果有一种方法可以表示蓝色像素连续且重复了72词,那么这种方法表示的位图文件将会比原来的小很多。这样的压缩方法称为游程长度编码(Run-Length Encoding),即RLE。

通常办公室的传真机采用的就是RLE压缩方法,压缩过程一般在传真机通过电话线传送图像之前。由于传真机展现出的图片都是黑白两色,没有灰度和彩色,所以通常像素值都会有很长串的白色区域,适合使用RLE压缩。

这十多年里风光无限的位图文件格式是图形交换格式(Graphics Interchange Format)即GIF,由计算服务(CompuServe)公司于1987年开发。GIF文件所采用的压缩技术称为LZW,LZW源自其三位创建者的名字:Lemplel,Ziv和Welch。LZW比RLE更加强大,因为它考虑的是像素值的模式(patterns),而RLE针对的是具有相同值的像素串。

RLE和LZW都属无损(lossless)压缩技术范畴,因为可以从压缩数据中重新生成完整的初始文件。专业一点的说法是,压缩过程是可逆的(reversible)。可逆压缩方法并不适用于所有类型的文件,这点不难证明。在某些情况下,采用这些方法“压缩”后的文件比初始文件还要大!

近几年来看,有损(lossy)压缩技术大行其道。有损失的压缩是不可逆的,这是由于部分原始数据在压缩过程中被丢弃了。有损压缩技术不应该用于电子报表或文字处理文档,因为在这些重要文档里面少一个数字或者字母都会“失之毫厘,谬之千里”。但对于压缩图像,这些损失还是可以接受的,部分数据的损失不会使图片的整体效果有太大的变化。这就是为什么有损压缩技术的思想起源于心理视觉的原因,心理视觉领域所探究的是人的视觉,并根据心理因素确定人们所看到的景象中哪些比较重要而哪些不重要。

在JPEG中,人们使用了一系列具有重大意义的位图有损压缩技术。JPEG代表的是联合图像专家组(Joint Photography Experts Group),它涵盖了几种压缩技术,其中一些是无损的,另一些是有损的。

光学字符识别

把图元文件转换成位图文件的方法很简单。这是由于视频显示存储器与位图在概念上保持一致。如果程序能把图源文件花在视频显示存储器中,则它也能在位图上画出图元文件。

但从位图文件到图元文件的转换却不那么容易,如果位图文件过于复杂甚至会导致无法转换。为了解决此类问题,人们发明了一项技术,那就是光学字符识别(Optical Character Recognition),或简称OCR。

对于位图上出现的一些字符(来自于传真机,或来自于页面扫描),如果需要转换成ASCII码,那么OCR就会派上用场。OCR软件会对比特流进行模式识别,然后确定其代表的字符。由于算法的复杂性,ORC软件并不能保证百分之百准确。虽然不很准确,但是ORC软件一直尝试将于手写的字符也转换成ASCII码字符。

脉冲编码调制技术

位图和图元文件都是数字化的可视信息。同理,音频信息也能转换成比特和字节。

1983年,随着激光唱机(compact disc)的出现,数字化音响激起了消费者的热情,它也成为了最大的电子消费品。CD由Philips和Sony公司开发,在一个直径12cm的盘上一面可存储74分钟的数字化声音。之所以选择74分钟是因为贝多芬的第九交响曲刚好可以放在一张CD上。

CD中声音信息采用的编码技术被称为脉冲编码调制技术(Pulse Code Modulation),简称为PCM。名字听起来有些故弄玄虚,但从概念上讲PCM其实是一种很简单的过程。

振动是声音之源。人们发出的声音来源于声带的振动,大号的声音也来自于振动,它们的振动来源于空气分子的移动。

声波可以被模拟,一个成功的例子就是1877年爱迪生发明的第一台电唱机,它利用银箔圆桶表面上的隆起和凹陷部位录制和播放背景音乐。直到CD的出现,这种录制技术才发生了稍许变化,圆桶变成了光盘,锡箔变成了塑料。早期的电唱机是机械化的,但是后来,电子放大器被用来放大声音。声音可以通过麦克风上配备的可变电阻转换成电流。喇叭中的电磁铁也可以将电流转换成声音。

代表声音的电流与先前所讲过信号不同,本书之前讨论的是在“连通——断开”之间跳变的1/0数字信号。声波的变化是连续的,因而产生电流的电压也是如此。在这里电流产生的目的是模拟(analog)声波。为了达到这个目的,我们使用了一种新设备,通常把它叫做模拟数字转换器(Analog To Digital Converter,ADC)——所有的功能集成在了一个芯片上——将模拟电压转换成二进制数表示。ADC输出是若干位数字信号———通常为8,12或16比特——用来表明电压的相对级别。如果ADC的转化长度为12比特,那么电压值的取值范围为000h~FFFh,这样一来就可以区分出4096个不同的电压级别。

在一种名为脉冲编码调制(Pulse Code Modulation)的技术中,以电压形式表示的声波将以恒定的频率被转换成数值。而这些数值将以小孔的形式刻在光盘表面,通过这种方式,电压就以数值的形式被存储在CD上。要读取这些信息时,可以通过分析从CD表面反射的激光读取到所存储的数值。在播放声音的时候这些数值又被转换成电流,这一过程利用了数值模拟转换器(Digital-To-Analog converter,即DAC,DAC还可以用在彩色图形板上,将像素值转换成模拟信号并传输至显示器)。

声波电压在恒定的频率下被转换成了数字,该频率被称为采样率(sampling rate)。1928年,贝尔电话实验室的哈里·奈奎斯特(Harry Nyquuist)通过证明了一个重要结论:采样频率应至少为被采样信号(即被纪录和播放的信号)最大频率的两倍。人类可以听到的声音频率范围通常为20~20 000Hz。CD使用的采样频率为每秒44100次,比人类听觉范围最大频率的两倍还要大一些。

每个样本所用的位数取决于CD的动态范围,即纪录和播放的声音的最高频率与最低频率之差。这难免给人感觉有些复杂:电流通过不断变化来模拟声波,其达到的最高峰称为声波的振幅(amplitude)。我们感知到的声音强度是振幅的两倍。1贝尔(bel),代表着强度的10倍;1分贝(decibel)代表着1贝尔的十分之一。1分贝代表着人类所能感知到的声音最小强度变化。

如果每次采样大小为16比特,这样就能够表示96分贝的动态范围,这一范围的下限是刚好能听到的声音的阀值(低于这一值的声音是听不到的),而上限就是人们承受最大符合声音的极限阀值。CD光盘的每个采样点就是用16比特表示的。

综上所述,CD光盘中每秒产生44100个采样样本,每个样本占据2个字节。有时你还希望享受立体声效果,这样的话采样信息需要翻倍,则每秒总共需要176 400字节,算下来每分钟需要10 584 000个字节(这是个庞大的数字,正因如此,20世纪80年代前数字记录声音的方法并没有普及)。74分钟的立体声CD需要字节数为783 216 000.

相对于模拟声音,数字化声音的优点不言而喻。特被是在模拟声音被复制的时候(例如把录音磁带转录成电唱片)难免会有些失真。而对于用数字形式表示的数字化声音而言,都可以实现无失真的转录或复制。细心观察的人会发现,过去在电话通话中,信号传输线路越长则声音越糟。这种情况已经一去不复返了,因为现在大部分电话系统都已经数字化,即使你打跨国电话,听筒的声音也像在对街对话一样清晰。

数字化声音

CD也可像存储声音一样来存储数据。用得最广泛的用来存放数据的CD称作CD-ROM(CD只读存储器),通常CD-ROM最多可存储约660MB。今天,许多计算机中都装有CD驱动器,许多应用程序和游戏都在CD-ROM中。

大约10年前,声音、音乐、视频开始进入个人计算机中,这称为多媒体(multimedia)。现在多媒体已经很普遍了,也不需要特别的名称。如今的家用计算机都配备声卡,声卡中包含了一个ADC,它可以将麦克风传输的模拟声音信号转储成为数字信号,此外还包括一个DAC,它的作用是帮助扩音器播放录制的数字声音。声音还可以按照波形文件(waveform files)方式存放于磁盘。

在我们使用家用计算机录制和播放声音的时候,其实对声音质量要求并不高,一般不会苛求达到CD的效果,所以Macintosh和Windows这两种操作系统提供了较低的采样概率,尤其是22050Hz,11025Hz和8000Hz这三种频率,采样信息量也保持在较少的8位,并且使用了频度录制手段。声音录制时所占的存储容量也减少到了每秒8000字节,这样算下来每分钟约占480000字节。

很多人在科幻电影及电视剧集中看到过这样的场景,未来的计算机正在用纯正的英语与用户进行交互。只要计算机配备了录制和播放数字化声音的硬件,那么实现这个目标不过是一个软件问题。

如果要使计算机能够用易于理解的单词和句子与人交谈,有很多种方法。一种方法是预先录制句子,短语,单词还有数字,然后将它们以文件的形式存储,之后使用多种形式将其糅合在仪器。这种方法常见于电话公司的信息系统中,在这种环境下只需要有限的单词,数字及其组合,因此这种方式能适用。

有一种更加通用的声音合成方法,它把ASCII码字符转化成波形数据。例如在英语拼写方面,由于存在很多不一致性,软件系统需要使用一个词典或复杂的算法来确定单词的准确发音。一个完整的单词由基本的音节组成。一般情况下软件都需要做一些其他方面的调整。如果一个句子后紧跟着的是问好,则最后一个单词的发音频率必须相应提高。

语音识别(voice recognition)——把波形数据转换成ASCII码字符——这个是一个极其复杂的过程。其实许多人在理解口语化方言时也有很多困难。在使用个人计算中的语音处理软件时,通常需要对软件进行样本训练,以便软件能尽量准确地转录某个人的话语。这中间涉及的问题已经大大超出了ASCII码文本转换的范畴,从本质上来讲是一个利用编程技术使得计算机“理解”人类语言的过程。这类问题正是人工智能(artificial Intelligence)所研究的领域。

当今计算机中的声卡还配备了小型电子音乐合成器,它能模仿128种不同的乐器和47种不同的打击乐器,这类设备被称作MIDI合成器。MIDI即乐器数字接口(Musical Instrument Digital Interface),这项发明出现于20世纪80年代早期,由电子音乐合成器制造者协会开发出来,用来把这些电子乐器互相连接起来并连到计算机中。

不同种类的MIDI合成器用不同的方法来合成乐器的声音,其中一些比另一些更逼真。

MIDI合成器的性质已远远超过了MIDI定义的范畴。所要做的无非是通过演奏声音来响应短消息序列——通常长度为1、2或3个字节。MIDI消息本身就指明了说需要的乐器,将要演奏的音符,或正在演奏的音乐的休止符。

MIDI文件是加上时间信息的MIDI消息的集合。通常,一个MIDI文件包含有计算机上的MIDI合成器所能演奏的所有音乐成分。相比于包含同样一段音乐的波形文件,MIDI文件通常比波形文件小得多。按照相对大小来说,如果说一个波形文件像位图文件,则MIDI文件就像矢量图形元文件。MIDI文件的不足之处在于:以MIDI文件编码的音乐可能在一个MIDI合成器上演奏得很好,但在另一个合成器上演奏出来可能不堪入耳。

数字化电影

数字化电影是多媒体的另一片天地。把一系列精致图像快速播放,可以达到电影和电视图像中出现的物体移动效果。我们把这期间出现的当个图像称为帧(frames)。但因的播放速率为24帧/秒,北美的电视节目为30帧/秒,世界上大部分地方的电视为25帧/秒。

计算机中的电影文件由一系列有声音的位图简单组成。但如果不经过压缩,一个电影文件将包含大量的数据。例如,假设一个电影每一帧的大小是640×480像素的计算机屏幕,有24位彩色,则每帧有921600字节。按每秒30帧,则每秒27648000字节。一直乘下去,则每分钟为1658880000字节,一个两小时的电影有199065600000字节,大约200GB。这就是为什么许多在个人计算机上播放的电影又小又短,解析度很小,清晰度很差的原因。

就像JEPG压缩技术可以用来减少静态图像所占的数据空间一样,MPEG压缩技术用于处理动态电影文件。MPEG全称是移动图像专家小组(Moving Pictures Expert Group)。动态图像压缩技术基于的一个客观事实,即每一帧继承了前一帧的大部分信息,也就是说存在冗余信息。

对不同的媒体来说,有不同的MPEG标准。MPEG-2用于高清晰度电视(HDTV)及数字视盘(DVD),也叫数字万用盘。DVD的大小与CD一样,但可以两面记录且每一面有两层。在DVD中,视频信息按照大约50倍这样的因子进行压缩,所以,一个两小时的电影只需4GB,且只需放在一面的一层。如果用两面和两层,则DVD的容量可达到大约16GB,约是CD容量的25倍。可以预见,DVD最终将取代CD-ROM来存储软件。

Internet

随着CD-ROM和DVD-ROM的出现,这是否意味着万·布什语言的麦克斯存储器在今天成为了现实?最原始的麦克斯存储器设想中,使用的原始材料是缩微胶片,但显然CD-ROM和DVD-ROM更合适担此重任。由于电子媒体易于检索,它们比物理设备更具有优越性。可惜同时访问多个CD或DVD驱动器并不现实。我们的存储设备有一点与万·布什所提出的概念有所不同,那就是所有信息并不一定要触手可及,真正使他们达到信息共享的做法是计算机互连,这样做还可以更有效地利用存储空间。

对计算机进行公开性远程操作的第一人是乔治·史帝比兹(George Stibitz),也正是他,在20世纪30年代设计了贝尔实验室的继电器计算机。对继电器计算机的远程操作的演示地点在达特茅斯,时间是在1940年。

电话系统在线路上传输的是声音,而不是比特。在电话线路上传输比特需要先将其转换成声音,传输完之后在转换回比特。单一频率和振幅的连续声波(统称为载波,carrier)无法表达完整清晰的信息。但如果对声波进行一些调整——说得专业一点就是,对声波进行调制(modulate)使其反映两种不同的状态——通过这种方式可以表示出0和1.将比特与声波进行互相转换的设备被称作调制解调器(moderm,它包括调制和解调两个功能)。调制解调器以串口(serial)形式工作,因为字节中的单个比特是一个连一个传输的,而不是一拥而上(打印机一般通过并行接口与计算机相连:整个字节由8根线并行传输)。

早期调制解调器采用了频移键控(frequency-shift keying, FSK)技术。假设调制解调器的处理速度为300bps,而且二进制数0被调制到1070Hz,而1被调制到1270Hz。每个字节被夹在一个起始位和一个停止位中间,所以每个字节其实占据了10位空间。在300bps的传输速率下,每秒传输的字节数为30个。现在许多采用先进技术的新一代调制解调器速度超过了它的100倍。

早期家用计算机的狂热爱好者可以使用计算机和调制解调器建立电子公告牌系统(Bulletin Board System,BBS),其他计算机可以连接到这个系统中并下载(download)文件,这意味着文件从远程计算机传输到了自己的计算机。这些概念发展广泛,甚至于扩展到了大型信息服务领域中,例如线上资料库服务(CompuServe)。在大多数环境下,通信中采用的一般都是ASCII码。

Internet则不同于这些早期的成就,因为它是分散的系统。Internet从本质上来讲是一组协议的集合,这些协议是计算机之间互相通信的保证。众多的协议中,最重要的当属TCP/IP协议,它包括了传输控制协议(Transmission Control Protocol,TCP)和网际协议(Internet Protocol,IP)。这种协议使得传输过程变得规则化,不再是简单地通过线路传输ASCII码字符,而由基于TCP/IP协议的传输系统把大的数据块分割成小的包(packets),之后在传输线路上(通常是电话线上)独立发送,最后在传输线路的另一端将数据重新组装起来。

Web

Internet 中最流行的是万维网(World Wide Web),而这一部分与图形联系最紧密。万维网采用了HTTP协议来支持其工作,HTTP(Hypertext Transfer Protocol)即超文本传输协议。几乎所有Web页面上看到的数据都遵循一定格式,那就是HTML(Hypertext Markup Language),即超文本标记语言。其中超文本(hypertext)这个单词用来描述相关链接信息,非常类似于万·布什语言的麦克斯存储器。HTML文件可以包含只想其他Web页面的链接,这样可以轻松访问其他页面。

HTML与本章前面讨论过的富文本格式(RTF)很相似,它们都含有带有格式信息的ASCII码文本。HTML也可包含多种图片格式,例如:GIF文件,PNG(portable network graphics,便携式网络图像格式)文件,以及JFIF(JPEG文件交换格式)等。大部分万维网浏览器都支持浏览HTML文件,这是文本格式的优势所在。易检索性也是HTML倍定义成文本文件的另一个优点。虽然明知可能有些让人迷惑,但HTML与我们在第19章和第24章讲到的语言不同,它并不是真正的程序设计语言。Web浏览器首先读取HTML文件,根据读取到的内容显示文本和图形并编排它们的格式。

当我们浏览某些Web页面并进行一些操作时,有一些特殊程序需要并发执行,程序中的代码可以运行在服务器端(Server,用来存储原始Web页面的计算机)或客户端(Client),我们自己的计算机就是客户端。服务器端责任重大,通常要完成一些充要的处理工作(例如解释客户端填写的在线表单),服务器端的工作可以通过公共网关接口(Common Gateway Interface,CGI)脚本来处理。面对于客户端,HTML文件可以包含简单的程序设计语言,例如著名的JavaScript。Web浏览器可以对JavaScript语句进行解释,就像解释HTML文本一样。

为什么Web站点不为我们的计算机提供一个可执行程序,如果这样的话问题一下子就解决了。要回答这个问题,我们首先要明确:我们的计算机是什么样的呢?如果使用的是Macintosh机,那么这个可执行程序需要包含Power PC机器码,而且需要引用Mac OS中的API函数;如果是一台PC兼容机,那么这个可执行程序需要包含Intel Pentium机器码,而且需要使用Windows API函数。但计算机及图形化操作系统的种类繁杂,还有许多其它类型的计算机和图形操作系统。进一步来说,我们也不想毫无目的地下载可执行文件,它们很可能来自于非信任站点而且会带有恶意行为。

上述问题的答案就在Sun公司开发的Java语言中。Java是一款成熟的面向对象程序设计语言,如C++有些类似。前面章节中我们讨论过编译语言(compiled language,可产生包含机器码的可执行文件的语言)和解释语言(不可产生可执行文件的语言)之间的区别,Java是一种介于两者之间的语言。它需要经过编译,但编译的结果不是机器码,而是Java字节码(Java byte codes)。Java字节码与机器码在结构上很相似,但Java字节码可以在一种虚拟的计算机下被解释,即Java虚拟机(Java Virtual Machine,JVM)上。被便衣的Java程序产生Java字节码,之后计算机模拟JVM对其进行解释。Java程序的运行可以不受限于机器与图形操作系统类型,所以它具有平台无关心(platform-independent).

关于如何利用电流在线路上传输信号和信息,在讲述这一点时本书利用了大段章节,但其实有一种更加行之有效的方法,那就是利用光纤——一种玻璃或聚合体制造的光导纤维,通过从不同角度对光进行反射达到光传输效果。光信号在光纤中的传输速率可以达到千兆赫兹——即每秒十亿个比特。

展望未来,在以后的家庭和办公室中,光子似乎要替代电子承担海量信息传输的重任。比起莫尔斯码中的一“点”一“划”,比起为了与一街之隔的好友深夜交流而绞尽脑汁想出的闪光灯,光子的速度无与伦比。

Loading Disqus comments...
Table of Contents