CF_BITMAP 保存位图数据:使用 CF_DIB 格式代替 GlobalSize 和 memcpy
在 CF_BITMAP 中,可以使用 CF_DIB 格式来保存位图数据,而不是使用 GlobalSize 和 memcpy 函数来保存字节。
CF_DIB 格式中的数据结构是 BITMAPINFOHEADER 加上位图数据。BITMAPINFOHEADER 结构包含了位图的信息,如宽度、高度、位深等。位图数据就是实际的像素数据。
保存位图数据的方法是首先创建一个 BITMAPINFOHEADER 结构,将位图的信息填充到这个结构中。然后,将位图的像素数据拷贝到一个新的内存块中,再将这个内存块设置为 CF_DIB 格式的剪贴板数据。
以下是一个示例代码,展示了如何保存位图数据到 CF_DIB 格式的剪贴板数据:
HBITMAP hBitmap = ...; // 获取位图句柄
// 获取位图信息
BITMAP bm;
GetObject(hBitmap, sizeof(BITMAP), &bm);
// 创建 BITMAPINFOHEADER 结构并填充信息
BITMAPINFOHEADER bi;
ZeroMemory(&bi, sizeof(BITMAPINFOHEADER));
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = bm.bmWidth;
bi.biHeight = bm.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = bm.bmBitsPixel;
bi.biCompression = BI_RGB;
bi.biSizeImage = bm.bmWidthBytes * bm.bmHeight;
// 创建新的内存块,用于保存位图像素数据
HGLOBAL hDib = GlobalAlloc(GHND, sizeof(BITMAPINFOHEADER) + bi.biSizeImage);
LPVOID lpDib = GlobalLock(hDib);
// 将 BITMAPINFOHEADER 结构拷贝到内存块中
memcpy(lpDib, &bi, sizeof(BITMAPINFOHEADER));
// 将位图像素数据拷贝到内存块中
LPVOID lpBits = (LPBYTE)lpDib + sizeof(BITMAPINFOHEADER);
GetBitmapBits(hBitmap, bi.biSizeImage, lpBits);
// 设置剪贴板数据为 CF_DIB 格式
OpenClipboard(NULL);
EmptyClipboard();
SetClipboardData(CF_DIB, hDib);
CloseClipboard();
// 释放内存块
GlobalUnlock(hDib);
GlobalFree(hDib);
这样,位图数据就会以 CF_DIB 格式保存在剪贴板中了。可以使用 GetClipboardData 函数获取位图数据,并进行后续处理。
原文地址: https://www.cveoy.top/t/topic/qgY5 著作权归作者所有。请勿转载和采集!