从剪贴板获取CF_DIBV5的位图

我正试图从剪贴板中获取位图数据。 我可以成功获取CF_DIBV5对象的头信息:

  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! } } } //... 

我可以从标题中成功记录信息。 现在我想要实际的HBITMAP所以我可以将它传递给GetDIBits 。 文档说CF_DIBV5是一个BITMAPV5HEADER “后跟位图颜色空间信息和位图位”。

最后一部分让我感到讽刺,因为它用简单的英语。 我假设得到位图位,我需要将标题的大小和“颜色空间信息”添加到标题指针。 所以

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

我认为…

我怎么知道这个神秘的色彩空间信息的大小? 并且“位图位”字面上是HBITMAP,以便上面的表达式是真的吗?

因为我是C新手,所以我可能会忽略这一点。

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

这是如何获得指向位图位的适当指针。 内容的排列取决于标题中描述的压缩类型和位数。

 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;