您应该能够使用CF_BITMAP 来获取HBITMAP 的句柄。然后使用GetDIBits将HBITMAP复制到cv::Mat内存中。
如果由于某种原因CF_BITMAP 不可用,请参阅此CF_DIB 备份示例,或查看可用的格式。
void copy()
{
cv::Mat mat;
HBITMAP hbitmap = nullptr;
if (!::OpenClipboard(nullptr))
return;
if (IsClipboardFormatAvailable(CF_BITMAP))
hbitmap = (HBITMAP)GetClipboardData(CF_BITMAP);
if(!hbitmap && IsClipboardFormatAvailable(CF_DIB))
{
HANDLE handle = GetClipboardData(CF_DIB);
LPVOID hmem = GlobalLock(handle);
if (hmem)
{
BITMAPINFO* bmpinfo = (BITMAPINFO*)hmem;
int offset = (bmpinfo->bmiHeader.biBitCount > 8) ?
0 : sizeof(RGBQUAD) * (1 << bmpinfo->bmiHeader.biBitCount);
BYTE* bits = (BYTE*)(bmpinfo)+bmpinfo->bmiHeader.biSize + offset;
HDC hdc = ::GetDC(0);
hbitmap = CreateDIBitmap(hdc,
&bmpinfo->bmiHeader, CBM_INIT, bits, bmpinfo, DIB_RGB_COLORS);
::ReleaseDC(0, hdc);
GlobalUnlock(hmem);
}
}
if (hbitmap)
{
BITMAP bm;
::GetObject(hbitmap, sizeof(bm), &bm);
int cx = bm.bmWidth;
int cy = bm.bmHeight;
if (bm.bmBitsPixel == 32)
{
mat.create(cy, cx, CV_8UC4);
BITMAPINFOHEADER bi = { sizeof(bi), cx, -cy, 1, 32, BI_RGB };
GetDIBits(hdc, hbitmap, 0, cy, mat.data, (BITMAPINFO*)&bi, DIB_RGB_COLORS);
}
}
CloseClipboard();
}