我在开发一个视频播放器,怎么实现复制图像到剪贴板呢

我在开发一个视频播放器,用到了vlc和迅雷的播放组件,怎么复制正在播放的图像呢?虽然都有生成截图文件的功能,但我需要复制图像到剪贴板或者内存,就像potplayer或者gif123那样?

@卢光庆

使用 Windows API 函数:OpenClipboard()、EmptyClipboard()、SetClipboardData() 和 CloseClipboard()。首先,把图像保存到内存中,然后打开剪贴板,清空剪贴板,将图像数据设置到剪贴板,最后关闭剪贴板。

#include <Windows.h>
#include <iostream>

int main() {
    // 创建一个位图
    HBITMAP hBitmap = CreateBitmap(100, 100, 1, 32, NULL);
    if (hBitmap == NULL) {
        std::cout << "Failed to create bitmap" << std::endl;
        return -1;
    }
    
    // 打开剪贴板
    if (OpenClipboard(NULL)) {
        // 清空剪贴板
        EmptyClipboard();
        // 将位图数据设置到剪贴板
        SetClipboardData(CF_BITMAP, hBitmap);
        // 关闭剪贴板
        CloseClipboard();
    } else {
        std::cout << "Failed to open clipboard" << std::endl;
        return -1;
    }
    
    return 0;
}

如果需要复制正在播放的图像,则需要先从 VLC 和迅雷组件中获取图像,然后将其转换为位图,然后再将位图复制到剪贴板。

问题补充:

@m0_54204465 的代码可以运行,复制出来的是灰色图像,可以粘贴到网页版ps或编辑器中。

但怎么加载文件还是没有完全搞明白。使用gdi+是可以以的,参考:https://stackoverflow.com/questions/39200677/how-to-copy-a-picture-from-disk-into-the-clipboard-with-win32

但不使用gdi+,而用std_image.h,复制出来的图像不对。 虽然 hBitmap 创建成功,但要么粘贴不出来,要么粘贴出来要么是灰色的?

bool copyimage(HBITMAP hbitmap)
{
    if (hbitmap && OpenClipboard(NULL)) {
        EmptyClipboard();
        SetClipboardData(CF_BITMAP, hbitmap);
        CloseClipboard();
        return 1;
    }
    return 0;
}

void takeSnapShot(const char* psz_filepath)
{
   int x=0,y=0,n;
   unsigned char *pImage = stbi_load("G:\\IMG\\123.png", &x, &y, &n, 4);


   BITMAPINFO bmi;
   ::ZeroMemory(&bmi, sizeof(BITMAPINFO));
   bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
   bmi.bmiHeader.biWidth = x;
   bmi.bmiHeader.biHeight = -y;
   bmi.bmiHeader.biPlanes = 1;
   bmi.bmiHeader.biCompression = BI_RGB;
   bmi.bmiHeader.biBitCount = n*8;
   bmi.bmiHeader.biSizeImage = x * y * n;

   LPBYTE pDest = NULL;
   HBITMAP hBitmap = ::CreateDIBSection(NULL, &bmi, DIB_RGB_COLORS, (void**)&pDest, NULL, 0);
   //hBitmap = CreateBitmap(100, 100, 1, 24, NULL);
   if(hBitmap) {
       stbi_image_free(pImage);

       bool succ = copyimage(hBitmap);

       DeleteObject(hBitmap);  

       LogIs(2, "succ = %d", succ);
   }
}