winapi - 了解 GetDiBits。 C++

标签 winapi dib getdibits createdibsection

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

  1. GetDiBits 是如何避免这种情况的?我可以只使用未选择的、新创建的位图作为此函数的参数吗?
  2. GetDiBits 以及 CreateDibSection 返回一个数组。但是 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 也不会“绘制”,但会在位图中设置像素数据。

  1. Naming confusion.

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

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

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

  1. What's the DC for?

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

CreateDIBSection 创建一个混合位图,以独立于设备的方法存储数据,但也可以保持与设备相关的副本同步以提高性能。因此它需要知道预期设备的 DC。

关于winapi - 了解 GetDiBits。 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49784146/

相关文章:

c++ - 使用 GetDIBits 加载位图

c++ - 设置 ListView 的项目高度? (使用自定义绘制)

c++ - CoInitializeSecurity() 和媒体基础编码器之间的奇怪连接

Python:使用 Win32 COM Api 打开 Excel 工作簿

winapi - 为什么InternetOpenURL 会报错误2(系统找不到指定的文件)?

c++ - 如何仅使用直接 WinAPI 将与设备无关的位图放入 Windows 剪贴板? (没有 MFC 或其他包装器)

c++ - 使用 GetDIBits 访问图像的像素颜色

winapi - 使用 Windows GetDIBits 函数获取位图像素值