从剪贴板获取CF_DIBV5的位图

时间:2016-06-20 02:45:39

标签: c windows clipboard

我正在尝试从剪贴板中获取位图数据。我可以成功获取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_DIBV5BITMAPV5HEADER“后跟位图颜色空间信息和位图位”。

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

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

我想......

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

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

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

1 个答案:

答案 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;