从剪贴板获取 CF_DIBV5 的位图

Get bitmap of a CF_DIBV5 from clipboard

我正在尝试从剪贴板获取位图数据。我可以成功获取 CF_DIBV5 object:

的 header 信息
    BOOLEAN exists = IsClipboardFormatAvailable(CF_DIBV5) &&
        OpenClipboard(session->windowHandle);

    if (exists) {
        HGLOBAL clipboard = GetClipboardData(CF_DIBV5);
        exists = clipboard != NULL;
        if (exists) {
            LPTSTR lptstr = GlobalLock(clipboard);
            exists = lptstr != NULL;
            if (exists) {
                BITMAPV5HEADER * header = clipboard;
                //now need the HBITMAP!
            }
        }
    }
    //...

我可以从 header 成功记录信息。现在我想要实际的 HBITMAP,这样我就可以将它传递给 GetDIBits。文档说 CF_DIBV5BITMAPV5HEADER "followed by the bitmap color space information and the bitmap bits".

讽刺的是,最后一部分让我感到困惑,因为它是简单的英语。我假设要获取位图位,我需要将 header 和 "color space information" 的大小添加到 header 指针。所以

HBITMAP bitmap = header + sizeof(BITMAPV5HEADER) + /* ???? */;

我觉得...

怎么才能知道这个神秘颜色的大小space信息呢? "bitmap bits" 字面上的 HBITMAP 是否使上述表达式为真?

因为我是 C 新手,所以我可能忽略了显而易见的东西。

更新: 我现在通过试验和重读一些文档意识到 HBITMAP 是一个 DDB,而我有一个 DIB。所以 GetDIBits 对我来说不是正确的功能。可以使用什么函数将任何 DIB 转换为无压缩格式?

以下是获取位图位的适当指针的方法。内容的排列取决于 header.

中描述的压缩类型和位数
HGLOBAL clipboard = GetClipboardData(CF_DIBV5);
BITMAPV5HEADER* bitmapV5Header = (BITMAPV5HEADER*)GlobalLock(clipboard);
int offset = bitmapV5Header->bV5Size + bitmapV5Header->bV5ClrUsed * sizeof(RGBQUAD);
if (bitmapV5Header->bV5Compression == BI_BITFIELDS)
    offset += 12; //bit masks follow the header
BYTE *bits = (BYTE*)bitmapV5Header + offset;