【问题标题】:Can imdecode be used to clipboard image?imdecode 可以用于剪贴板图像吗?
【发布时间】:2021-11-11 02:42:00
【问题描述】:

我想在不使用临时文件的情况下使用OpenCV 中的 Windows 剪贴板图像数据。

我可以为此使用imdecode 吗?

我试过了,但Mat 是空的:

if(!IsClipboardFormatAvailable(CF_DIB)) return;

OpenClipboard(NULL);
HGLOBAL clipboard = GetClipboardData(CF_DIB);

if(clipboard){
    char* data = (char*)GlobalLock(clipboard);
    Mat buf = Mat(1, GlobalSize(clipboard), CV_8UC1, data, Mat::AUTO_STEP);
    Mat mat = imdecode(buf, IMREAD_UNCHANGED);
    GlobalUnlock(clipboard);
}

CloseClipboard();

【问题讨论】:

    标签: c++ opencv winapi clipboard


    【解决方案1】:

    您似乎缺少相应的 SetClipboardData

    我不知道opencv,但通常当我使用剪贴板时,我会写这样的东西

      const auto opened = OpenClipboard(GetConsoleWindow());
      if (opened)
      {
        EmptyClipboard();
    
        const std::string command{"hello clipboard"};
    
        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();
      }
    

    免责声明:删除错误处理和打印输出

    【讨论】:

    • 感谢您的回答。但我想阅读剪贴板,而不是写它。 (我已经使用了GetClipboardData 而不是SetClipboardData
    【解决方案2】:

    您应该能够使用CF_BITMAP 来获取HBITMAP 的句柄。然后使用GetDIBitsHBITMAP复制到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();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-08
      • 1970-01-01
      • 1970-01-01
      • 2017-06-06
      • 1970-01-01
      • 1970-01-01
      • 2015-03-07
      • 1970-01-01
      相关资源
      最近更新 更多