c++ - GDI 屏幕截图,结果在不同的计算机上有所不同

标签 c++ windows bitmap screenshot gdi

我尝试用 GDI 截屏,然后在 FFmpeg 中使用它。 屏幕截图运行良好,FFmpeg 处理它没有任何问题。

但是,在某些计算机上,图像并不是我想要的,如下所示。

enter image description here

这是我用来初始化位图的代码:

//--
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/

相关文章:

c++ - C++ 中的声明

c++ - 对类静态 constexpr 结构的 undefined reference ,g++ vs clang

windows - Metro 应用程序可以知道其他应用程序吗?

image - Bitmap 和 Pixmap 有什么区别?

android - 无法从 Google 个人资料图片网址获取位图

c++ - 为函数内的数组元素赋值

string - 如何逐行读取批处理文件中多余字符的文本文件?允许限制行长度。(Windows,批处理脚本)

windows - 制作一个 .reg 文件以在右键菜单中添加快捷方式

java - Android 位图压缩不足导致 OutOfMemoryError 崩溃

c++ - C++ 和/或 C 中的 size_t 与 int