了解GetDiBits。 C ++

时间:2018-04-11 20:41:09

标签: winapi dib getdibits createdibsection

MSDN表示在调用此函数之前,不应将GetDiBits中使用的位图选入DC。但根据我的经验(使用BitBlt),我知道除非选择了位图,否则我无法绘制位图。

  1. GetDiBits如何绕过这个?我可以使用未选择的,新创建的位图作为此函数的参数吗?
  2. GetDiBits以及CreateDibSection返回一个数组。但是MSDN谈到了第一个功能:

      

    “指定兼容位图的位”

    我认为DI代表DeviceIndependent。为什么会出现矛盾?这意味着,根据MSDN,GetDiBits只能与CreateCompatibleBitmap(DD)一起使用?然后我不能将这个数组发送到另一台机器来显示它,对吗?

  3. 这两个函数都使用hDC。如果CreateDibSection真的是DIndependent,为什么它需要一个hDC?所有需要的信息都是通过bitmapinfoheader ...
  4. 提供的

1 个答案:

答案 0 :(得分:5)

  
      
  1. 除非选中,否则我无法绘制位图。 GetDiBits如何绕过这个?
  2.   

GetDIBits不做任何绘图。它从位图读取像素数据并将其转换为所需的颜色格式。 SetDIBits没有"画"或者,它会将像素数据设置在位图中。

  
      
  1. 命名混乱。
  2.   

GetDIBitmap中的DI指的是像素数据以与设备无关的格式返回这一事实(特别是您要求的格式)。源位图可以是兼容的位图或与设备无关的位图。

类似地,SetDIBitmap采用与设备无关的像素数据并将其转换为目标位图的类型。

这些功能令人困惑。

  
      
  1. DC的用途是什么?
  2.   

DC用于回答有关设备上像素格式的任何问题。例如,如果源格式是基于调色板的设备相关位图,则GetDIBits将假定选择到DC中的调色板是正确的。请注意,调色板不在BITMAPINFOHEADER中。

CreateDIBSection创建一个混合位图,用于在与设备无关的方法中存储数据,但也可以保持与设备相关的副本与其同步以提高性能。所以它需要知道目标设备的DC。