我尝试使用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...)。
我不明白为什么我的代码遵循了我找到的所有示例...
请帮帮我!
Vcl::Forms::TMonitor* pMon = Screen->Monitors[i]; mWidth = pMon->Width; mHeight = pMon->Height; mWxHxS = mWidth*mHeight*3;
- MaypeurbiClrUsed
不应该设置为每像素的位数。它是用于基于调色板的图像,这些图像不使用调色板中的所有颜色。除非您正在创建带有调色板(颜色表)的位图,否则应将其设置为0。 - Adrian McCarthy