【发布时间】:2012-01-26 21:34:08
【问题描述】:
我有一个 directshow 过滤器,我使用下面的代码来捕获屏幕。
首先我使用
获得窗口矩形EnumWindows
这给了我 lpRect
HDC hMemDC;
HBITMAP hBitmap, hOldBitmap;
int nX, nY, nX2, nY2;
int nWidth, nHeight;
if (IsRectEmpty(lpRect))
return NULL;
hMemDC = CreateCompatibleDC(hScrDC);
nX = lpRect->left;
nY = lpRect->top;
nX2 = lpRect->right;
nY2 = lpRect->bottom;
nWidth = nX2 - nX;
nHeight = nY2 - nY;
hBitmap = CreateCompatibleBitmap(hScrDC, nWidth, nHeight);
hOldBitmap = (HBITMAP) SelectObject(hMemDC, hBitmap);
BitBlt(hMemDC, 0, 0, nWidth, nHeight, hScrDC, nX, nY, SRCCOPY);
hBitmap = (HBITMAP) SelectObject(hMemDC, hOldBitmap);
GetDIBits(hScrDC, hRawBitmap, 0, nHeightScanLines, pData, pHeader, DIB_RGB_COLORS);
DeleteDC(hMemDC);
问题是当我调整我要捕获的窗口大小时,它应该看起来像这样
然而结果是这样的
我感觉这是由于图像宽度的像素数,但是我不确定如何调整 directshow 过滤器的输出宽度和高度?
【问题讨论】:
-
您能分享实际调整大小的代码和进行渲染的代码吗?某处似乎“音高”变量被忽略了。
-
上面的代码是我用来做渲染的(在FillBuffer方法中)。对于调整大小,我实际上只是将 lpRect 更改为窗口的矩形。
-
对,但是您如何将这些位保存到文件和/或将它们呈现到屏幕上?我怀疑你的问题出在那儿。
-
我在“HRESULT CScreenCap::FillBuffer(IMediaSample *pSample)”中获取样本,然后使用“pSample->GetPointer(&pData);”然后 pData 被传递到 DIBits
-
我怀疑在所有这些捕获和转换过程中的某个地方 - 你们中的一个“宽度”变量不能被 4 整除。您应该熟悉“表面步幅”以及它与 BMP 文件和/或blitting到屏幕上。本页底部的更多详细信息:msdn.microsoft.com/en-us/library/windows/desktop/…
标签: c++ window directshow capture