与设备无关的位图

与设备无关的位图 (DIB) 包含 颜色表。 颜色表描述像素值与 RGB 颜色值的对应方式,这些值描述由发射光产生的颜色。 因此,DIB 可以在任何设备上实现正确的配色方案。 DIB 包含以下颜色和维度信息:

  • 创建矩形图像的设备的颜色格式。
  • 创建矩形图像的设备分辨率。
  • 创建映像的设备的调色板。
  • 将红色、绿色、蓝色 ( RGB ) 三元元素映射到矩形图像中的像素的位数组。
  • 一个数据压缩标识符,指示 (使用任何) 来减小位数组大小的数据压缩方案。

颜色和维度信息存储在 BITMAPINFO 结构中,该结构由 BITMAPINFOHEADER 结构组成,后跟两个或多个 RGBQUAD 结构。 BITMAPINFOHEADER 结构指定像素矩形的尺寸,描述设备的颜色技术,并标识用于减小位图大小的压缩方案。 RGBQUAD 结构标识像素矩形中显示的颜色。

DIB 有两种:

  • 自下而上的 DIB,其中原点位于左下角。
  • 自上而下的 DIB,其中原点位于左上角。

如果 DIB 的高度(如位图信息标头结构的 Height 成员所指示)为正值,则为自下而上的 DIB;如果高度为负值,则为自上而下的 DIB。 无法压缩自上而下的 DDB。

颜色格式根据颜色平面和颜色位的计数指定。 颜色平面的计数始终为 1;对于单色位图,颜色位的计数为 1,VGA 位图为 4,其他颜色设备上的位图为 8、16、24 或 32。 应用程序通过调用 GetDeviceCaps 函数检索特定显示器 (或打印机) 使用的颜色位数,并将 BITSPIXEL 指定为第二个参数。

显示设备的分辨率以每米像素为单位指定。 应用程序可以按照此三步过程检索视频显示器或打印机的水平分辨率。

  1. 调用 GetDeviceCaps 函数,将 HORZRES 指定为第二个参数。
  2. 再次调用 GetDeviceCaps ,将 HORZSIZE 指定为第二个参数。
  3. 将第一个返回值除以第二个返回值。

应用程序可以通过使用不同的参数使用相同的三步过程来检索垂直分辨率:VERTRES 代替 HORZRES,VERTSIZE 代替 HORZSIZE。

调色板由 RGBQUAD 结构数组表示,这些结构指定显示设备调色板中每种颜色的红色、绿色和蓝色强度分量。 调色板数组中的每个颜色索引映射到与位图关联的矩形区域中的特定像素。 此数组的大小(以位为单位)等效于矩形的宽度(以像素为单位),乘以矩形的高度(以像素为单位),再乘以设备的颜色位计数。 应用程序可以通过调用 GetDeviceCaps 函数(将 NUMCOLORS 指定为第二个参数)来检索设备调色板的大小。

Windows 支持压缩 8 bpp 和 4 bpp 自下而上 DDB 的调色板数组。 可以使用运行长度编码 (RLE) 方案压缩这些数组。 RLE 方案使用 2 字节值,第一个字节指定使用颜色索引的连续像素数,第二个字节指定索引。 有关位图压缩的详细信息,请参阅 BITMAPINFOHEADERBITMAPFILEHEADERBITMAPV4HEADERBITMAPV5HEADER 结构的说明。

应用程序可以通过初始化所需的结构并调用 GetDIBits 函数,从 DDB 创建 DIB。 若要确定设备是否支持此函数,请调用 GetDeviceCaps 函数,并将RC_DI_BITMAP指定为 RASTERCAPS 标志。

需要复制位图的应用程序可以使用 TransparentBlt 将源位图中的所有像素复制到目标位图,但那些与透明颜色匹配的像素除外。

应用程序可以通过调用 SetDIBitsToDeviceStretchDIBits 函数,使用 DIB 在显示设备上设置像素。 若要确定设备是否支持 SetDIBitsToDevice 函数,请调用 GetDeviceCaps 函数,并将RC_DIBTODEV指定为 RASTERCAPS 标志。 将 RC_STRETCHDIB 指定为 RASTERCAPS 标志,以确定设备是否支持 StretchDIBits

只需显示预先存在的 DIB 的应用程序可以使用 SetDIBitsToDevice 函数。 例如,电子表格应用程序可以使用 SetDIBitsToDevice 函数打开现有图表并在窗口中显示它们。 但是,若要在窗口中重复重绘位图,应用程序应使用 BitBlt 函数。 例如,将动画图形与声音相结合的多媒体应用程序将受益于调用 BitBlt 函数,因为它的执行速度比 SetDIBitsToDevice 快。