Device-Independent 位图
独立于设备的位图(DIB)包含 颜色表。 颜色表描述像素值如何对应于 RGB 颜色值,这些值描述通过发出光产生的颜色。 因此,DIB 可以在任何设备上实现适当的配色方案。 DIB 包含以下颜色和维度信息:
- 创建矩形图像的设备的颜色格式。
- 创建矩形图像的设备分辨率。
- 创建映像的设备调色板。
- 将红色、绿色、蓝色(RGB)三重映射到矩形图像中的像素的位数组。
- 一个数据压缩标识符,指示用于减小位数组大小的数据压缩方案(如果有)。
颜色和维度信息存储在 BITMAPINFO 结构中,该结构由 BITMAPINFOHEADER 结构组成,后跟两个或更多个 RGBQUAD 结构。 BITMAPINFOHEADER 结构指定像素矩形的尺寸、描述设备的颜色技术以及用于减小位图大小的压缩方案。 RGBQUAD 结构标识像素矩形中显示的颜色。
DIB 有两个品种:
- 一个自下而上 DIB,其起源位于左下角。
- 一个从上到下 DIB,其起源位于左上角。
如果 DIB 的高度(如位图信息标头结构的 Height 成员指示)是正值,则它是自下而上 DIB;如果高度为负值,则为自上而下 DIB。 无法压缩自上而下的 DIB。
颜色格式根据颜色平面和颜色位的计数来指定。 颜色平面计数始终为 1;对于单色位图,颜色位数为 1,VGA 位图为 4,其他颜色设备上的位图为 8、16、24 或 32。 应用程序通过调用 GetDeviceCaps 函数(将 BITSPIXEL 指定为第二个参数)来检索特定显示器(或打印机)使用的颜色位数。
显示设备的分辨率以每米像素为单位指定。 应用程序可以按照以下三个步骤检索视频显示或打印机的水平分辨率。
- 调用 GetDeviceCaps 函数,将 HORZRES 指定为第二个参数。
- 再次调用 GetDeviceCaps,并将 HORZSIZE 指定为第二个参数。
- 将第一个返回值除以第二个返回值。
应用程序可以使用具有不同参数的相同三步过程检索垂直分辨率:VERTRES 代替 HORZRES,使用 VERTSIZE 代替 HORZSIZE。
调色板由一组 RGBQUAD 结构表示,这些结构指定显示设备调色板中每种颜色的红色、绿色和蓝色强度组件。 调色板数组中的每个颜色索引都映射到与位图关联的矩形区域中的特定像素。 此数组的大小(以位为单位)等效于矩形的宽度(以像素为单位),乘以矩形的高度(以像素为单位),乘以设备的颜色位计数。 应用程序可以通过调用 GetDeviceCaps 函数来检索设备调色板的大小,并将 NUMCOLORS 指定为第二个参数。
Windows 支持压缩 8-bpp 和 4-bpp 的调色板数组。 可以使用运行长度编码 (RLE) 方案压缩这些数组。 RLE 方案使用 2 字节值,第一个字节指定使用颜色索引的连续像素数,第二个字节指定索引。 有关位图压缩的详细信息,请参阅 BITMAPINFOHEADER、BITMAPFILEHEADER、BITMAPV4HEADER和 BITMAPV5HEADER 结构的说明。
应用程序可以通过初始化所需的结构并调用 GetDIBits 函数,从 DDB 创建 DIB。 若要确定设备是否支持此函数,请调用 GetDeviceCaps 函数,将RC_DI_BITMAP指定为 RASTERCAPS 标志。
需要复制位图的应用程序可以使用 TransparentBlt 将源位图中的所有像素复制到目标位图,但与透明颜色匹配的像素除外。
应用程序可以通过调用 SetDIBitsToDevice 或 StretchDIBits 函数来设置显示设备上的像素。 若要确定设备是否支持 SetDIBitsToDevice 函数,请调用 GetDeviceCaps 函数,并将RC_DIBTODEV指定为 RASTERCAPS 标志。 将RC_STRETCHDIB指定为 RASTERCAPS 标志,以确定设备是否支持 StretchDIBits。
只需显示预先存在的 DIB 的应用程序即可使用 SetDIBitsToDevice 函数。 例如,电子表格应用程序可以使用 SetDIBitsToDevice 函数打开现有图表并将其显示在窗口中。 但是,若要在窗口中重复重绘位图,应用程序应使用 BitBlt 函数。 例如,将动画图形与声音相结合的多媒体应用程序将受益于调用 BitBlt 函数,因为它的执行速度更快于 SetDIBitsToDevice。