我在开发一个视频播放器,用到了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);
}
}