我试图用GDI截图,然后我在FFmpeg中使用它。 屏幕截图效果很好,FFmpeg处理它没有任何问题。GDI截图,结果在不同的计算机上变化
但是,在某些计算机上,图像不是我想要的,就像你可以在下面看到的那样。
下面是我用它来初始化我的位图代码:
//--
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激活...)。 我不明白,因为我的代码按照我发现的所有例子...
请帮帮我!
寻找我就像你只是用rgb而不是rgba。 (只是我想到的第一件事) – AntiHeadshot
对,我只使用rgb频道,但我明白的是通过设置biClrUsed为24,BitBlt将rgba转换为rgb。此外,在我的电脑上DC返回32位,但图像是好的,我没有这个问题。 – Maypeur
你如何计算'mWxHxS'值? –