了解GetDiBits.C++

ser*_*ncu 2 winapi dib getdibits createdibsection

MSDN表示GetDiBits在调用此函数之前,不应将用于的位图选择为DC.但是从我的经验来看,BitBlt我知道除非选择了位图,否则我无法绘制位图.

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

    "指定的兼容位图的位"

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

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

Adr*_*thy 5

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

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

  1. 命名混乱.

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

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

这些功能令人困惑.

  1. 什么是DC?

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

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