从剪贴板获取 CF_DIBV5 的位图
Get bitmap of a CF_DIBV5 from clipboard
我正在尝试从剪贴板获取位图数据。我可以成功获取 CF_DIBV5
object:
的 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!
}
}
}
//...
我可以从 header 成功记录信息。现在我想要实际的 HBITMAP
,这样我就可以将它传递给 GetDIBits
。文档说 CF_DIBV5
是 BITMAPV5HEADER
"followed by the bitmap color space information and the bitmap bits".
讽刺的是,最后一部分让我感到困惑,因为它是简单的英语。我假设要获取位图位,我需要将 header 和 "color space information" 的大小添加到 header 指针。所以
HBITMAP bitmap = header + sizeof(BITMAPV5HEADER) + /* ???? */;
我觉得...
怎么才能知道这个神秘颜色的大小space信息呢? "bitmap bits" 字面上的 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;
我正在尝试从剪贴板获取位图数据。我可以成功获取 CF_DIBV5
object:
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!
}
}
}
//...
我可以从 header 成功记录信息。现在我想要实际的 HBITMAP
,这样我就可以将它传递给 GetDIBits
。文档说 CF_DIBV5
是 BITMAPV5HEADER
"followed by the bitmap color space information and the bitmap bits".
讽刺的是,最后一部分让我感到困惑,因为它是简单的英语。我假设要获取位图位,我需要将 header 和 "color space information" 的大小添加到 header 指针。所以
HBITMAP bitmap = header + sizeof(BITMAPV5HEADER) + /* ???? */;
我觉得...
怎么才能知道这个神秘颜色的大小space信息呢? "bitmap bits" 字面上的 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;