位图经常被用来表示来自现实世界的复杂的图像,比如数字化的照片或是视频截图。图元文件则更适合人工产生的或计算机产生的图像,比如建筑结构图。本节我们将讲述有关位图的基础知识。
本节必须掌握的知识点:
位图与图元文件
生成位图
第79练:获取显示器及打印机设备信息
第80练:最简单的打印程序
14.1.1 位图与图元文件
位图和图元文件都能存在内存中或是存为磁盘文件,两者都能通过剪贴板在Windows的应用程序中传递。
位图(Bitmap)和图元文件(Metafile)是两种不同的图像文件格式,它们在数据表示方式、图像质量、可编辑性等方面存在一些区别。以下是位图和图元文件之间的主要区别:
■数据表示方式
位图:位图使用像素网格(栅格)的方式来表示图像,每个像素的颜色值被直接编码。位图文件以像素阵列的形式存储图像数据。
图元文件:图元文件使用矢量图形的方式来表示图像,记录了图形的几何信息和绘制命令,而不是像素阵列。图元文件描述了图形中的线条、曲线、多边形、文本等几何形状和属性。
■图像质量
位图:位图是基于像素的表示方式,适用于连续色彩变化的图像。但在缩放或放大时,位图可能会出现像素失真、锯齿等现象,特别是在低分辨率下。
图元文件:图元文件是基于矢量形状的表示方式,可以无损地放大或缩小,保持图形的平滑和清晰度。图元文件在任意分辨率下都能保持高质量的显示。
■可编辑性
位图:位图文件通常是不可编辑的,因为它们记录了每个像素的颜色值,无法直接修改或编辑图像中的单个元素。它们会受设备相关问题的影响。最明显的设备相关性是色彩。在黑白设备上显示彩色位图通常都不好看。对位图的编辑通常需要使用图像处理软件,如调整亮度、对比度、应用滤镜等。
图元文件:图元文件是可编辑的,因为它们记录了图形的几何信息和绘制命令。图元文件可以通过矢量图形编辑器或绘图软件进行修改,可以编辑和调整图形的形状、颜色、大小等。
■文件大小
位图:由于位图文件存储了每个像素的颜色信息,因此文件大小通常较大。特别是对于高分辨率的位图图像,文件大小会相应增大。
图元文件:图元文件通常具有较小的文件大小,因为它们以矢量形状和绘制命令来表示图像,相对于位图来说,文件大小较小。
综上所述,位图适用于连续色彩变化的图像,但在缩放和编辑方面有限制,而图元文件适用于需要保持清晰度和可编辑性的图形。选择位图还是图元文件取决于具体的应用需求和图像特性。
当今的绝大多数图形输出设备都是点阵设备。它们包括视频显示器、点阵打印机、激光打印机和喷墨打印机。笔式绘图仪则是矢量输出设备。
■位图优点
位图相对于图元文件的优点之一是速度。把一个位图复制到视频显示器,通常比绘制一个图元文件要快得多。近些年的压缩技术,能让位图被压缩到能通过电话线有效传输的尺寸,并被广泛地应用于互联网的网页中。
14.1.2 生成位图
■创建位图的方法
●位图图像可以手工创建。比如,通过Windows自带的画图程序。如果有人用点阵的绘图软件,而不是矢量的画图程序,那肯定是因为他认为他的图像如果要用线条和填充区域来绘制会过于复杂。
●位图还能通过程序代码用算法来生成。尽管大多数算法生成的图像能被存成矢量图形 图元文件,但特别精细的表面或分形(fractal)常常要使用位图。
●扫描仪、摄像机、数码相机。当今,位图经常用于现实世界的图像,而各种各样的硬件设备则让你把现实中的图像转存到计算机里。这些硬件通常都使用一种叫做电荷耦合器件(CCD)的东西,它在光线照 射的情况下会产生电荷。有时CCD单元被组成一个阵列,每个像素就是一个CCD。要节约成本的话,也可以用单行的CCD来扫描图像。
14.2 位图尺寸
位图的尺寸是指图像的宽度和高度,通常以像素(Pixel)为单位进行表示。位图的尺寸决定了图像在屏幕或打印上的物理大小和像素密度。
位图尺寸的表示方式通常是“宽度 x 高度”,例如,一个位图尺寸为800像素宽度和600像素高度的图像可以表示为“800x600”。
位图的尺寸对图像的显示和打印效果有重要影响:
物理大小:较大的位图尺寸通常会在屏幕或打印上占据更大的空间,而较小的位图尺寸则会占据较小的空间。
分辨率:位图尺寸与像素密度直接相关。相同的位图尺寸下,较高的像素密度表示每英寸(或每厘米)包含更多的像素,从而产生更高的分辨率。高分辨率图像通常具有更多的细节和更清晰的显示效果。
处理性能:较大的位图尺寸意味着图像文件的大小更大,处理和加载这样的图像可能需要更多的计算资源和时间。
本节必须掌握的知识点:
颜色和位图
现实世界的设备
GDI中的位图支持
14.2.1 颜色和位图
位图除了有空间尺寸外,还有颜色维度,也就是每个像素所需的位的数目,有时候又叫位图的颜色深度(Color Depth),或位数,或每像素位数(bbp)。位图的每个像素都有同样 的颜色位数。
每像素只有一位的位图称为二级(bilevel)或二色(bicolor),或单色位图。每个像素不是0 就是1。其中0可以代表黑色,1代表白色,但也不一定总是这样。要想有更多颜色,就需要每个像素有更多的位。
如果像素位是2位,可以表示4种颜色,如果像素位为4,可以表示16种颜色。以此类推,像素位8位有256种颜色,16位有65 536种颜色,24位的话,则有16 777 216种颜色。
而颜色位的组合究竟怎样准确地与真实的颜色相对应,则一直是所有与位图打交道的人需要思考的问题。
14.2.2 现实世界的设备
显示器(Monitor)是用于显示图像和文字的设备,而位图(Bitmap)是一种图像文件格式。下面是显示器与位图之间的关系:
■显示器显示位图
当位图文件在计算机上被打开或加载时,其图像内容可以通过计算机的图形处理单元(GPU)发送到连接的显示器上进行显示。
显示器会按照位图的尺寸和分辨率来呈现图像。每个像素在显示器上对应显示一个点,显示器会根据位图的像素值显示相应的颜色和亮度。
■分辨率匹配
显示器的分辨率决定了它能够显示的像素数量。例如,一个显示器的分辨率为1920x1080,则表示它可以在水平方向上显示1920个像素,在垂直方向上显示1080个像素。
当位图的尺寸与显示器的分辨率匹配时,位图可以以原始像素的一对一方式在显示器上显示,保持最佳的图像质量和清晰度。
如果位图的尺寸与显示器的分辨率不匹配,显示器会进行缩放或拉伸操作来适应屏幕,可能导致图像的失真或模糊。
■像素密度
显示器的像素密度(Pixel Density)是指每英寸(或每厘米)显示的像素数量。较高的像素密度意味着显示器上的像素更小且更密集,从而可以显示更多的细节和更高的图像质量。
如果位图的分辨率高于显示器的像素密度,显示器可能无法完全展现位图的所有细节。反之,如果位图的分辨率低于显示器的像素密度,图像可能显得模糊或失真。
■位图的像素位
位图可以按它们的颜色位数目来分类:而不同的位图颜色格式则是基于自Windows存 在以来所常用的视频显示适配器的颜色能力。实际上,我们可以把视频显示器内存想象成 一个大的位图——也就是我们在显示器上看到的位图。
●单色设备:1像素位
Windows1.0最常用的视频适配器是IBM彩色图形适配器(CGA)和大力神图形适配器 (HGC)。HGC是单色设备,CGA在Windows下也只能用在单色图形模式下。单色位图还是 很常见的(比如,鼠标指针经常是单色的)。单色位图除了用来显示图像外也还有其他用途。
●增强图形适配器(EGA):4像素位
随着增强图形适配器(EGA)的出现,Windows用户可以访问16种颜色。每个像素需要 4个颜色位。(EGA实际上比这要复杂一些,它有一个64种颜色的调色板,应用程序可以从中选择16种颜色,但Windows用一种简单方式使用EGA。EGA上用的16种颜色是黑、 白、两种灰色、还有浅色的和深色的红、绿、蓝(就是三原色),青绿(蓝加上绿),洋红(蓝加上红)和黄(红加上绿)。这16种颜色是现在Windows所需的最低标准。同样,Windows 里还是有16色的位图。大多数图标是16色的位图。简单的卡通式的图像也通常用这16种颜色就够了。
●IRGB编码
16色位图的色彩编码有时被称为IRGB(强度-红-绿-蓝),它实际上是从IBM CGA的字 符模式中用到的颜色中衍生出来的。下表显示了每个像素用的四个IRGB颜色位是怎样对应到Windows十六进制的RGB颜色的。
IRGB | RGB颜色 | 颜色名称 |
0000 | 00-00-00 | 黑 |
0001 | 00-00-80 | 深蓝 |
0010 | 00-80-00 | 深绿 |
0011 | 00-80-80 | 深青 |
0100 | 80-00-00 | 深红 |
0101 | 80-00-80 | 深洋红 |
0110 | 80-80-00 | 深黄 |
0111 | C0-C0-C0 | 浅灰 |
1000 | 80-80-80 | 深灰 |
1001 | 00- 00- FF | 蓝 |
1010 | 00-FF-00 | 绿 |
1011 | 00-FF-FF | 青 |
1100 | FF-00-00 | 红 |
1101 | FF-00-FF | 洋红 |
1110 | FF-FF-00 | 黄 |
1111 | FF-FF-FF | 白 |
EGA的内存被分成四个“颜色平面”(IRGB强度-红-绿-蓝),每个像素颜色的定义是分别从这4个平面中取1位出来组合得一个IRGB值,然后将此值做为索引从上述表格中取出相应的RGB颜色。也就是说定义每个像素颜色的四个位在内存中不是连续的。在有些API调用,如GetDeviceCaps和CreateBitmap中,会出现这些颜色平面。
Windows 98和WindowsNT需要VGA或更高分辨率的图形卡。这是Windows当前所接受的视频图形板卡的最低标准。
●VGA或SVGA显卡:8像素位
8像素位可以表示256种颜色(每个像素用8位,不一定对应具体的颜色),显卡采用的是“调色板查找表”的方式。其中20种是保留颜色,其作236种可以自定义。
最早的视频图形阵列(VGA)是在1987年随着IBM的PS/2个人计算机推出的。它提供了好几种视频模式,但最好的图形模式(Windows所使用的)是横向640像素、纵向480像素,显示16种颜色。要显示256种颜色,最早的VGA不得不转成320*240的图形模式,这对Windows来说,像素数目太少了,没法正常工作。
人们常常会忘记最早的VGA的色彩限制,因为其他的硬件生产商很快就开发了“超级VGA”(或SVGA)适配器,它有更多的显示内存,而且能在640*480的模式下显示256种颜色或更多颜色。这些现在都是标准了,这是一件好事,因为16种颜色对显示真实的图像来说根本不够。
显示256种颜色的视频适配器模式每个像素要用8位。然而,这些8位值不一定对应到具体的颜色。实际上,显示卡采用“调色板査找表”的方式,让软件来制定这些8位值怎样对应到真正的颜色。在Windows中,应用程序不能直接访问这个硬件调色板査找表;相反,Windows保留256种颜色中的20个,应用程序用Windows调色板管理器来配置其他的236种颜色。第16章将详细地介绍这些。调色板管理器能让应用程序在256色的显示器上显示真实的位图。Windows保留的20种颜色如下所示:
颜色值 | RGB颜色 | 颜色名称 |
00000000 | 00-00-00 | 黑 |
00000001 | 80-00-00 | 深红 |
00000010 | 00-80-00 | 深绿 |
00000011 | 80-80-00 | 深黄 |
00000100 | 00-00-80 | 深蓝 |
00000101 | 80-00-80 | 深洋红 |
00000110 | 00-80-80 | 深青 |
00000111 | C0-C0-C0 | 浅灰 |
00001000 | C0-DC-C0 | 美元绿 |
00001001 | A6-CA-F0 | 天蓝 |
11110110 | FF-FB-F0 | 乳白 |
11110111 | A0-A0-A4 | 中灰 |
11111000 | 80-80-80 | 深灰 |
11111001 | FF-00-00 | 红 |
11111010 | 00-FF-00 | 绿 |
11111011 | FF-FF-00 | 黄 |
11111100 | 00- 00- FF | 蓝 |
11111101 | FF-00-FF | 洋红 |
11111110 | 00-FF-FF | 青绿 |
11111111 | FF-FF-FF | 白 |
●全真彩显卡:16或24像素位
每像素用16位或24位。现在一般用24位。即每个像素用3个字节表示。对于每个像素16位,有时候有一位不用,其他15位被均分给红、绿、蓝原色。这样一共支持32 768 种颜色,由红、绿、蓝每样32个色调组合而成。而更普遍的用法是,将6位分给绿色(这是人类最敏感的颜色这样能提供65 536种颜色。对于非技术型的PC用户,他们不想看到32 768或65 536这些古怪的数字,我们通常说这些视频适配器是“高彩”适配器,能提供数千种颜色。
提高到每像素24位的话,我们有16 777 216种颜色(又叫“真彩”或“百万色”每个像素用3个字节。这个标准很可能未来好多年内都不会变,因为它大致代表人类能够辨别的色彩极限,而且它很方便。
在调用GetDeviceCaps时(比如在第四章的DEVCAPS程序中),可以用BITSPIXEL和 PLANES常数来获得视频适配器的颜色组织。许多年来,它们可能的取值如下表所示。
BITSPIXEL | PLANES | 颜色数 |
1 | 1 | 2 |
1 | 4 | 16 |
8 | 1 | 256 |
15或16 | 1 | 32768或65536 |
24或32 | 1 | 16777216 |
14.2.3 GDI中的位图支持
Windows的图形设备接口(GDI)从1.0开始就支持位图了。但是,在3.0之前,在Windows 下唯一的位图支持是GDI对象,需要使用位图句柄来使用它们。这些GDI对象是单色的,或是跟真正的图形输出设备,如视频显示器,有着一样的颜色组织。例如,一个与16色VGA兼容的位图有四个颜色平面。问题在于,这些位图不能被保存和用在另一个有着不同颜色组织的图形输出设备上,比如,不能用在一个每像素8位,能显示256种颜色的显示器上。
从Windows 3.0开始,定义了一个新的位图格式,称为设备无关位图或DIB。DIB包含了它自身的颜色表,显示每个像素位怎样对应到RGB颜色。DIB能被显示在任何点阵输出设备上。唯一的问题是,DIB的颜色经常必须被转换为设备实际上能够处理的颜色。
随着DIB的推出,Windows 3.0还引进了 Windows调色板管理器,能让程序在256色显示器上自定义颜色。应用程序显示DIB时经常会同时使用调色板管理器,相关详情可以参见第十五章调色板。
Microsoft 在 Windows 95(和 Windows NT 4.0)中扩充了DIB 的定义,在 Windows 98(和Windows NT 5.0)中又作了进一步扩充。这些改进通常都涉及图像色彩管理(ICM),ICM能让DIB更精确地指定图像所需要的特定的颜色。在14.4节将简单介绍ICM。
尽管DIB很重要,但老的GDI位图对象在处理位图时仍然起着很重要的作用。要掌握位图,最好的策略可能还是按时间顺序来找资料,从GDI位图对象和位块传输着手。