gpt4 book ai didi

c - 从剪贴板获取 CF_DIBV5 的位图

转载 作者:行者123 更新时间:2023-11-30 15:07:49 25 4
gpt4 key购买 nike

我正在尝试从剪贴板获取位图数据。我可以成功获取 CF_DIBV5 对象的 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!
}
}
}
//...

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

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

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

我认为...

我怎样才能知道这个神秘的色彩空间信息的大小? “位图位”字面意思是 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;

关于c - 从剪贴板获取 CF_DIBV5 的位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37913989/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com