2

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

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

    “指定兼容位图的位”

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

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

1 回答 1

5
  1. 除非被选中,否则我无法绘制位图。GetDiBits 如何规避这一点?

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

  1. 命名混乱。

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

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

这些函数的名称令人困惑。

  1. DC是干什么用的?

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

CreateDIBSection 创建一个混合位图,它以与设备无关的方法存储数据,但也可以保持与设备相关的副本与其同步以提高性能。所以它需要知道预期设备的直流电。

于 2018-04-11T21:07:55.467 回答