位图

位图(Bitmap)
是 Windows操作系统存储图像的方式。
图像中的每个像素对应存储器中的一个或多个数据位,如单色位图(黑白)每个像素对应1位,16色位图每个像素对应4位(24),256色为8位(28),全彩色为24位等,所有的像素数据按照一行行的顺序排列在存储器中,每个像素对应的位数称为颜色深度。
位图大小由 分辨率 * 颜色深度决定!

位图的优势和不足

位图的优越之处是操作的速度很快。
因为计算机的屏幕显示是由硬件从视频缓冲区中的数据映射的,由于存放方式基本一致。
向视频缓冲区中拷贝数据就可以直接将图像显示在屏幕上,所以以位图的方式存储像素,显示图形的时间几乎就是向视频缓冲区拷贝数据的时间。
位图的不足之处基本可以归类为两点:
一是尺寸问题:由于位图是不压缩的,它占用的空间很大,一个1 024×768像素、24位色的图像的大小为1 024×768×3,达2.3MB;

二是位图的缩放问题。
我们都知道矢量和位图之间的关系,矢量图形(例如现在网上最流行的Flash就是矢量格式的)可以无限制缩放而不变形,因为它是根据矢量实时计算出像素数据的。
而位图缩放后要对原来的像素数据进行插值计算,不可避免地会有失真。

在使用Windows的位图之前,必须搞清楚几个概念:位图、设备无关位图和位图文件。
位图:
单纯意义上的”位图”指的就是存放在内存中、可以马上使用的位图,它的颜色深度总是对应当前设备(如屏幕或打印机等)的颜色深度。
如果不和具体的设备对应,位图数据是没有意义的,因为无法知道要把数据中的多少位解释成一个像素。具体可以进行扩展了解:bbs.fishc.com

设备无关位图
对于存放在磁盘上或别的地方的位图数据来说,它的颜色深度有可能和屏幕颜色深度不同。
为了准确描述它的颜色信息,必须有像素数据的属性说明以及色彩表,在使用这个位图的时候,可以根据这些信息将像素数据转换到需要的颜色深度。
色彩表和位图数据合在一起就叫做设备无关位图(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 文件类似的方法定义位图资源,然后在程序中装入后使用。
我们现在给大家简单介绍下在资源文件中定义位图的方式,对位图资源的大部分操作涉及 GDI 的内容,大家可以自己先自习第7章的内容。

在资源脚本文件中定义位图资源的语法是:
位图ID  BITMAP [DISCARDABLE] 位图文件名
在程序中可以用 LoadBitmap 函数装入位图资源
invoke LoadBitmap,hInstance,lpBitmapName
.if eax
mov hBitmap,eax
.endif
LoadBitmap 函数返回一个位图句柄,在程序退出的时候,位图句柄必须用 DeleteObject 函数释放。

原文地址:https://www.cnblogs.com/poli/p/4857817.html