从剪贴板获取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;