我想在OpenCV中使用Windows剪貼板影像資料而不使用臨時檔案。
我可以使用imdecode來實作嗎?
我試過這樣做,但Mat是空的:
if(!IsClipboardFormatAvailable(CF_DIB) return;
OpenClipboard(NULL)。
HGLOBAL clipboard = GetClipboardData(CF_DIB)。
if(clipboard){
char* data = (char*)GlobalLock(剪貼板)。
Mat buf = Mat(1, GlobalSize(clipboard), CV_8UC1, data, Mat::AUTO_STEP) 。
Mat mat = imdecode(buf, IMREAD_UNCHANGED);
GlobalUnlock(clipboard)。
}
CloseClipboard()。
uj5u.com熱心網友回復:
你似乎缺少相應的SetClipboardData
。我不知道opencv,但通常當我使用剪貼板時,我會寫這樣的東西
const auto opened = OpenClipboard(GetConsoleWindow()) 。
if ( opened)
{
EmptyClipboard()。
const std::string command{"hello clipboard"/span>}。
auto* const hMem = GlobalAlloc(GMEM_MOVEABLE, (command. size() 1))。)
if (hMem == nullptr)
{
CloseClipboard()。
return;
}
auto* const p = static_cast<LPSTR> (GlobalLock(hMem))。
if (p)
{
memcpy_s(p, command.size(), command.data(), command.size())。
p[command.size()] = 0;
GlobalUnlock(hMem)。
SetClipboardData(CF_TEXT, p); <<<<<
}
CloseClipboard()。
免責宣告:洗掉了錯誤處理和列印輸出
。uj5u.com熱心網友回復:
你應該能夠使用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;
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()。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/311672.html
標籤:
下一篇:以固定的fps值提取幀數
