我尝试用 GDI 截屏,然后在 FFmpeg 中使用它。 屏幕截图运行良好,FFmpeg 处理它没有任何问题。
但是,在某些计算机上,图像并不是我想要的,如下所示。
这是我用来初始化位图的代码:
//--
mImageBuffer = new unsigned char[mWxHxS];
memset(mImageBuffer, 0, mWxHxS);
//--
hScreenDC = GetDC(0);
hMemoryDC = CreateCompatibleDC(hScreenDC);
//--
bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bi.bmiHeader.biBitCount = 24;
bi.bmiHeader.biWidth = mWidth;
bi.bmiHeader.biHeight = mHeight;
bi.bmiHeader.biCompression = BI_RGB;
bi.bmiHeader.biPlanes = 1;
bi.bmiHeader.biClrUsed = 24;
bi.bmiHeader.biClrImportant = 256;
hBitmap = CreateDIBSection(hMemoryDC, &bi, DIB_RGB_COLORS, &mImageBuffer, 0, 0);
SelectObject(hMemoryDC, hBitmap);
这里是每张截图:
if(BitBlt(
hMemoryDC,
0,
0,
mWidth,
mHeight,
hScreenDC,
mPx,
mPy,
SRCCOPY | CAPTUREBLT
))
我在运行我的应用程序时没有任何错误,但这个丑陋的图像只在某些计算机上运行。 我不知道在这些计算机上造成的区别是什么(所有都是 Win7,Aero 激活......)。 我不明白,因为我的代码遵循我发现的所有示例......
请帮帮我!
最佳答案
您正在创 build 备独立位图 (CreateDIBSection),然后使用设备相关上下文 (CreateCompatibleDC) 来处理它。我相信您需要创建与 BitBlt 兼容的设备相关位图,或使用 StretchDIBits 来支持与设备无关的图像数据。这适用于某些计算机而不适用于其他计算机的原因是视频驱动程序决定了设备相关图像的格式,它可能与 Windows 对设备无关图像的定义相同也可能不同。
这是捕获图像的示例(是的,它不必要地长,但似乎仍然包含有用的信息):https://msdn.microsoft.com/en-us/library/windows/desktop/dd183402(v=vs.85).aspx
这里是关于 StretchDIBits 的文档,如果您需要 DIB:https://msdn.microsoft.com/en-us/library/windows/desktop/dd145121(v=vs.85).aspx
关于c++ - GDI 屏幕截图,结果在不同的计算机上有所不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35057476/