了解 GetDiBits。 C++

Understanding GetDiBits. C++

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

  1. GetDiBits 如何规避这个问题?我可以只使用未选择的、新创建的位图作为此函数的参数吗?
  2. GetDiBits 以及 CreateDibSection returns 一个数组。但是 MSDN 说第一个函数:

    "bits of the specified compatible bitmap"

    我以为 DI 代表 DeviceIndependent。为什么会有矛盾?这意味着,根据 MSDN,GetDiBits 只能与 CreateCompatibleBitmap(即 DD)一起使用?那我总不能把这个数组发到别的机器上显示吧?

  3. 两个函数都使用hDC。如果 CreateDibSection 确实是 DIndependent 为什么它需要一个 hDC?所有需要的信息都通过位图信息头提供...
  1. I cannot draw an a bitmap unless it is selected. How does GetDiBits circumvents this?

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

  1. Naming confusion.

GetDIBitmap 中的 DI 是指像素数据以 device-independent 格式 返回 (具体是您要求的格式)。源位图可以是兼容位图或 device-independent 位图。

同样,SetDIBitmap 获取 device-independent 像素数据并将其转换为目标位图的类型。

这些函数的命名容易混淆。

  1. What's the DC for?

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

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