我正在尝试从剪贴板中获取位图数据。我可以成功获取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
对我来说不是正确的功能。可以使用什么函数将任何DIB转换为没有压缩的格式?
答案 0 :(得分:1)
这里是如何获得指向位图位的适当指针。内容的排列取决于标题中描述的压缩类型和位数。
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;