使用资源—位图
位图(Bitmap)是Windows操作系统存储图像的方式,图像中的每个像素对应存储器中的一个或多个数据位,如单色位图每个像素对应1位,16色位图每个像素对应4位,256色为8位,全彩色为24位等,所有的像素数据按照一行行的顺序排列在存储器中,每个像素对应的位数称为颜色深度。
位图的优越之处是操作的速度很快,计算机的屏幕显示是由硬件从视频缓冲区中的数据映射的,向视频缓冲区中拷贝数据就可以直接将图像显示在屏幕上,所以以位图的方式存储像素,显示图形的时间几乎就是向视频缓冲区拷贝数据的时间。
位图的不便之处一是尺寸问题:由于位图是不压缩的,它占用的空间很大,一个1024x768像素24位色的图像的大小为1024x768x3字节,达2.3MB;二是位图的缩放问题,读者都知道矢量和位图之间的关系,矢量图形(现在网上最流行的Flash就是矢量格式的)可以无限制缩放而不变形,因为它是根据矢量实时计算出像素数据的,而位图缩放后要对原来的像素数据进行插值计算,不可避免地会有失真。
在使用Windows的位图之前,必须搞清楚几个概念:位图、设备无关位图和位图文件。
单纯意义上的“位图”指的就是存放在内存中、可以马上使用的位图,它的颜色深度总是对应当前设备(如屏幕或打印机等)的颜色深度,不和具体的设备对应,位图数据是没有意义的,因为无法知道要把数据中的多少位解释成一个像素。
对于存放在磁盘上或别的地方的位图数据来说,它的颜色深度有可能和屏幕颜色深度不同,为了准确描述它的颜色信息,必须有像素数据的属性说明以及色彩表,在使用这个位图的时候,可以根据这些信息将像素数据转换到需要的颜色深度。色彩表和位图数据合在一起就叫做设备无关位图(DIB),因为它转换后可以用在不同颜色深度的设备上。Windows有函数专门用来处理DIB。使用DIB唯一的问题是当将高颜色数的DIB转换到低颜色数的设备上时,由于色彩只能被转换成设备所能表示的最相近的颜色,所以可能会有很大的颜色失真。
DIB可以存放在磁盘上的位图文件中,位图文件一般以bmp为扩展名,它的内容包括一个bitmap文件头和DIB数据,bitmap文件头可以用来验证整个文件的有效性。所以简单地讲,DIB是位图数据的超集,位图文件又是DIB的超集。
Windows支持的图形文件格式只有bmp,ico与cur等几种,可以广泛用在GDI操作中的只有bmp文件,其他格式文件如jpg与tif等都是不能直接应用的,要使用这些文件,必须在代码中将它们转换到位图格式以后才行,所以要编写一个仅支持bmp的图片浏览器是很简单的,而要支持其他格式麻烦就大了,仅jpg格式的解码就是个很复杂的问题!
在资源中定义位图
Windows对bmp文件的支持有两种方法,一种是打开bmp文件读入DIB部分的数据,然后用函数将DIB数据转换到位图数据;另一种方法就是在资源文件中用和ico,cur文件类似的方法定义位图资源,然后在程序中装入后使用。
在资源脚本文件中定义位图资源的语法是:
位图ID BITMAP [DISCARDABLE] 位图文件名
在程序中可以用LoadBitmap函数装入位图资源:
invoke LoadBitmap, hInstance, lpBitmapName
.if eax
mov hBitmap, eax
.endif
LoadBitmap函数返回一个位图句柄,在程序退出的时候,位图句柄必须用DeleteObject函数释放。对位图资源的大部分操作涉及GDI的内容,以后再详细学习。