MSDN 说在调用此函数之前不应将 GetDiBits
中使用的位图选入 DC。但根据我的经验(使用 BitBlt
),我知道除非选择它,否则我无法绘制位图。
GetDiBits
是如何避免这种情况的?我可以只使用未选择的、新创建的位图作为此函数的参数吗?GetDiBits
以及CreateDibSection
返回一个数组。但是 MSDN 对第一个功能说:"bits of the specified compatible bitmap"
我以为 DI 代表 DeviceIndependent。为什么会有矛盾?这意味着,根据 MSDN,
GetDiBits
只能与CreateCompatibleBitmap
(即 DD)一起使用?那我总不能把这个数组发到别的机器上显示吧?- 这两个函数都使用 hDC。如果
CreateDibSection
是真正的 DIndependent 为什么它需要一个 hDC?所有需要的信息都通过位图信息头提供...
最佳答案
- I cannot draw an a bitmap unless it is selected. How does GetDiBits circumvents this?
GetDIBits 不做任何绘图。它从位图中读取像素数据并将其转换为所需的颜色格式。 SetDIBits 也不会“绘制”,但会在位图中设置像素数据。
- Naming confusion.
GetDIBitmap 中的 DI 指的是像素数据以与设备无关的格式(特别是您要求的格式)返回。源位图可以是兼容位图或设备无关位图。
类似地,SetDIBitmap 获取与设备无关的像素数据并将其转换为目标位图的类型。
这些函数的名称容易混淆。
- What's the DC for?
DC 用于回答有关设备像素格式的任何问题。例如,如果源格式是基于调色板的设备相关位图,GetDIBits 将假定选择到 DC 中的调色板是正确的。请注意,调色板不在 BITMAPINFOHEADER 中。
CreateDIBSection 创建一个混合位图,以独立于设备的方法存储数据,但也可以保持与设备相关的副本同步以提高性能。因此它需要知道预期设备的 DC。
关于winapi - 了解 GetDiBits。 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49784146/