第十四章 位图和Bitblt(位图入门,位图尺寸)

位图呈矩形,并有空间尺寸,图像的高度和宽度都以图素为单位。例如,此网格可描述一个很小的位图:宽度为9图素,高度为6图素,或者更简单地计为9×6:

 

 

习惯上,位图的速记尺寸是先给出宽度。位图总数为9×6或者54图素。我将经常使用符号cx和cy来表示位图的宽度和高度。c表示计数,因此cx和cy是沿着x轴(水平)和y轴(垂直)的图素数。

我们能根据x和y坐标来描述位图上具体的图素。一般(并不都是这样),在网格内计算图素时,位图开始于图像的左上角。这样,在此位图右下角的图素坐标就是(8, 5)。因为从0开始计数,所以此值比图像的宽度和高度小1。

位图的空间尺寸通常也指定了分辨率,但这是一个有争议的词。我们说我们的视讯显示有640×480的分辨率,但是激光打印机的分辨率只有每英寸300点。我喜欢用后一种情况中分辨率的意思作为每单位图素的数量。位图在这种意义上的分辨率指的是位图在特定测量单位中的图素数。不管怎样,当我使用分辨率这个词语时,其定义的内容应该是明确的。

位图是矩形的,但是计算机内存空间是线性的。通常(但并不都是这样)位图按列储存在内存中,且从顶列图素开始到底列结束。(DIB是此规则的一个主要例外)。每一列,图素都从最左边的图素开始依次向右储存。这就好像储存几列文字中的各个字符。

颜色和位图

除空间尺寸以外,位图还有颜色尺寸。这里指的是每个图素所需要的位数,有时也称为位图的 颜色深度(color depth)、位数(bit-count)或 位/图素(bpp:bits per pixel)数。位图中的每个图素都有相同数量的颜色位。

每图素1位的位图称为二阶(bilevel)、 二色(bicolor)或者单色 (monochrome)位图。每图素可以是0或1,0表示黑色,1可以表示白色,但并不总是这样。对于其它颜色,一个图素就需要有多个位。可能的颜色值等于2位数值。用2位可以得到4种颜色,用4位可以得16种颜色,8位可得到256种颜色,16位可得到65,536种颜色,而24位可得到16,777,216种颜色。

如何将颜色位的组合与人们所熟悉的颜色相对应是目前处理位图时经常碰到(而且常常是灾难)的问题。

实际的设备

位图可按其颜色位数来分类;在Windows的发展过程中,不同的位图颜色格式取决于常用视讯显示卡的功能。实际上,我们可把视讯显示内存看作是一幅巨大的位图-我们从显示器上就可以看见。

Windows 1.0多数采用的显示卡是IBM的彩色图像适配器(CGA:Color Graphics Adapter)和单色图形卡(HGC:Hercules Graphics Card)。HGC是单色设备,而CGA也只能在Windows以单色图形模式使用。单色位图现在还很常用(例如,鼠标的光标一般为单色),而且单色位图除显示图像以外还有其它用途。

随着增强型图形显示卡(EGA:Enhanced Graphics Adapter)的出现,Windows使用者开始接触16色的图形。每个图素需要4个颜色位。(实际上,EGA比这里所讲的更复杂,它还包括一个64种颜色的调色盘,应用程序可以从中选择任意的16种颜色,但Windows只按较简单的方法使用EGA)。在EGA中使用的16种颜色是黑、白、两种灰色、高低亮度的红色、绿和蓝(三原色)、青色(蓝和绿组合的颜色)。现在认为这16种颜色是Windows的最低颜色标准。同样,其它16色位图也可以在Windows中显示。大多数的图示都是16色的位图。通常,简单的卡通图像也可以用这16种颜色制作。

在16色位图中的颜色编码有时称为IRGB(高亮红绿蓝:Intensity-Red-Green-Blue),并且实际上是源自IBM CGA文字模式下最初使用的十六种颜色。每个图素所用的4个IRGB颜色位都映像为表14-1所示的Windows十六进制RGB颜色。

表14-1

 

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的内存组成了四个「颜色面」,也就是说,定义每个图素颜色的四位在内存中是不连续的。然而,这样组织显示内存便于使所有的亮度位都排列在一起、所有的红色位都排在一起,等等。这样听起来就好像一种设备依赖特性,即Windows程序写作者不需要了解所有细节,但这时应或多或少地知道一些。不过,这些颜色面会出现在一些API呼叫中,例如GetDeviceCaps和CreateBitmap。

Windows 98和Microsoft Windows NT需要VGA或分辨率更高的图形卡。这是目前公认的显示卡的最低标准。

1987年,IBM最早发表视讯图像数组(Video Graphics Array:VGA)以及PS/2系列的个人计算机。它提供了许多不同的显示模式,但最好的图像模式(Windows也使用其中之一)是水平显示640个图素,垂直显示480个图素,带有16种颜色。要显示256种颜色,最初的VGA必须切换到320×240的图形模式,这种图素数不适合Windows的正常工作。

一般人们已经忘记了最初VGA卡的颜色限制,因为其它硬件制造商很快就开发了「Super-VGA」(SVGA)显示卡,它包括更多的视讯内存,可显示256种颜色并有多于640×480的模式。这是现在的标准,而且也是一件好事,因为对于现实世界中的图像来说,16种颜色过于简单,有些不适合。

显示256种颜色的显示卡模式采用每图素8位。不过,这些8位值都不必与实际的颜色相符。事实上,显示卡提供了「调色盘对照表(palette lookup table)」,该表允许软件指定这8位的颜色值,以便与实际颜色相符合。在Windows中,应用程序不能直接存取调色盘对照表。实际上,Windows储存了256种颜色中的20种,而应用程序可以通过「Windows调色盘管理器」来自订其余的236种颜色。关于这些内容,我将在 第十六章详细介绍。调色盘管理器允许应用程序在256色显示器上显示实际位图。Windows所储存的20种颜色如表14-2所示。

表14-2

 

IRGB

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

最近几年,True-Color显示卡很普遍,它们在每图素使用16位或24位。有时每图素虽然用了16位,其中有1位不用,而其它15位主要近似于红、绿和蓝。这样红、绿和蓝每种都有32色阶,组合起来就可以达到32,768种颜色。更普遍的是,6位用于绿色(人类对此颜色最敏感),这样就可得到65,536种颜色。对于非技术性的PC使用者来说,他们并不喜欢看到诸如32,768或65,536之类的数字,因此通常将这种视讯显示卡称为Hi-Color显示卡,它能提供数以千计的颜色。

到了每个图素24位时,我们总共有了16,777,216种颜色(或者True Color、数百万的颜色),每个图素使用3字节。这与今后的标准很相似,因为它大致代表了人类感官的极限而且也很方便。

在呼叫GetDeviceCaps时(参见第五章的DEVCAPS程序),您能利用BITSPIXEL和PLANES常数来获得显示卡的颜色单位,这些值显示如表14-3所示

表14-3

 

BITSPIXEL

PLANES

颜色数

1

1

2

1

4

16

8

1

256

15或16

1

32,768或65 536

24或32

1

16 777 216

最近,您应该不会再碰到单色显示器了,但即便碰到了,您的应用程序也应该不会发生问题。

GDI支援的位图

Windows图形设备接口(GDI:Graphics Device Interface)从1.0版开始支持位图。不过,一直到Windows 3.0以前,Windows下唯一支持GDI对象的只有位图,以位图句柄来使用。这些GDI位图对象是单色的,或者与实际的图像输出设备(例如视讯显示器)有相同的颜色单位。例如,与16色VGA兼容的位图有四个颜色面。问题是这些颜色位图不能储存,也不能用于颜色单位不同的图像输出设备(如每图素占8位就可以产生256种颜色的设备)上。

从Windows 3.0开始,定义了一种新的位图格式,我们称之为设备无关位图(device-independent bitmap),或者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:Image Color Management),并允许DIB更精确地指定图像所需要的颜色。我将在 第十五章简要讨论ICM。

不论DIB多么重要,在处理位图时,早期的GDI位图对象依然扮演了重要的角色。掌握位图使用方式的最好方法是按各种用法在演进发展的时间顺序来学习,先从GDI位图对象和位块传输的概念开始。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值