首先需要说明的是,笔者在计算机图形学、图像处理、计算机硬件等方面可能都只有浅显的了解。因此,笔者关于这些方面内容的叙述,有可能是不恰当甚至是错误的;当然,本章节的目的也只是略微交代一下背景,同时保证本系列博文逻辑链条上的完整——以满足笔者那病态的强迫心理。

计算机屏幕的构造

首先,即便是在现实的物理世界中,物理量的测量数值也是离散的——至少从最严格的意义上说是如此;不记得在哪里听过这样一句话:

你不可能在现实世界中画一条长度精确为 $\pi$ 的线段。

听上去很有哲理,这句话告诉我们,无理数、连续这些概念或许只存在与我们脑海中的那个介乎于实在和虚无之间的、数学的思维世界(或许还可以从这句话切入写一写为什么数学不是自然科学)。

好吧,回归主题,我们想要说明的是:

作为计算机的外围设备,电子屏幕的成像也是离散的

展开来讲,即是说一块电子屏幕,其是由若干个最小成像单位构成的,这些成像单位根据输入的图像信息,协调地显示各自应该显示的颜色和光彩,从而使得人眼能看到一副完整的画面。

一般把电子屏幕的最小成像单位称之为 “像素”,为了和位图文件的单位作区分,有时候也称之为 “屏幕像素

矢量图与位图

核心区别:信息的存储与表示形式

笔者第一次接触到这两个名词,还是在小学三年级的时候——那时候信息技术课本的样子笔者还记得,黄色封面,最后一两章讲的是 Windows 98 系统自带的 “画图” 程序。就在那一章节中,提到了 “矢量图” 和 “位图” 的概念,不得不说,我国的教材理论性有余,但是亲民度不足。

这两个概念的核心区别在于:图的内在信息在计算机中如何表述和存储?

  1. 位图:

    使用某种传感技术,捕捉实际画面,对捕捉的信号进行量化之后,存储在离散的点阵当中;

  2. 矢量图:

    存储抽象的线段、点等几何元素的解析式以及色彩信息

示例

还是举个例子好了。

下图是一个位图,图中的内容是一个黑色的圆。

circle

图1:位图

这个图片文件所存储的内容(在逻辑层面上)实际上是这样的:

$$\begin{bmatrix} P(0,0),\ P(0,1),\ \dots,\ P(0,n) \\ P(1,0),\ P(1,1),\ \dots,\ P(1,n) \\ \dots \\ P(m,0),\ P(m,1),\ \dots,\ P(m,n) \\ \end{bmatrix}$$

其中的 $P(i,j)$ 表示的是位图存储图片信息的最小单位,我们也称之为 “像素”,为了区分起见,我们不妨也把它称之为 “数码像素"

每个像素蕴含了两方面的信息:

  1. 像素内部的信息:该像素点应该显示什么颜色和亮度、该像素点的透明度是多少,等等,这一般由像素自身的值表示

  2. 像素自身的位置信息:这个像素本身应该在哪个地方出现,比如 $P(i,j)$ 就表示这个像素应该在第 $i$ 行、第 $j$ 列出现;


下图是一个矢量图

circle

图2:矢量图

这个图片的内部信息存储方式应该是这样的(当然实际上很有可能并不是这样的,笔者这里加入了自己的臆想,但总体方向上大致如此):

看到区别的了吗,矢量图会记录图片文件更为抽象的内容,比如图形的解析式等等——而不像位图那样精确到一幅画面的每个角落,这也是 “矢量” 一词的由来。

从文件到屏幕

众所周知,计算机系统上的数据是以文件的形式存储的,而任何形式的文件在本质上都是二进制串的集合——图片文件亦不例外;

一张图片,从文件形式到屏幕上的画面,中间经历了若干个转换过程。

G 文件:实际存储二进制码 文件:实际存储二进制码 逻辑:看待信息的方式 逻辑:看待信息的方式 文件:实际存储二进制码->逻辑:看待信息的方式 屏幕:最终显示效果 屏幕:最终显示效果 逻辑:看待信息的方式->屏幕:最终显示效果

上一节矢量图与位图所说的信息表示的方式,实际上正是逻辑层面上看待图片信息的方式

需要说明的是,逻辑层面上图片信息的存储表达方式不一定等同于其在文件中的实际存储方式。就拿位图来举例,位图的信息在逻辑上可以看做像素的点阵,但是在实际的存储过程中,其并不一定就一一对应地存储点阵中的像素值,而往往会经过处于压缩、校验等目的的编码后在再存储(当然还可能经过许多别的底层操作)。

至于逻辑层面的表示和最终屏幕显示的画面之间,同样不是简单的一一对应关系,也要经过一定的转换;但是转换过程视图片是位图还是矢量图有所不同。

  1. 如果是位图,那么位图在逻辑层面上的像素和物理世界中屏幕的屏幕像素在考虑缩放比例后应该就可以对应起来;

  2. 如果是矢量图,那么其逻辑层面上的信息需要进行通过数学计算等方式 “还原” 为点阵的方式(因为最终屏幕显示相当于一个点阵),然后再根据其他补充信息确定那些屏幕像素需要显示什么颜色、何种亮度

说句题外话,正因为位图和矢量图在这些方面的不同,它们在 “失真” 问题上有着不同的表现:

位图如果强行放大到一定的比例,会导致其单个数码像素对应着多个屏幕像素——因为像素点阵的尺寸是有限的,从而精度也是有限的,那么看上去原本平滑的边就会显现出锯齿,也就是 “失真” (准确地说,失真不止这一种情况)

而矢量图就不一样了,它存储的主要是几何对象的抽象信息,对它进行放大,计算机会不断重新计算其应该在屏幕上哪些地方显示什么,所以从某种意义上说,矢量图可以以无限精度在屏幕上显示,永远保持边的平滑。

读者可以放大本网页,看看上面的两幅示例图,自然一目了然。