C# 在webbrowser控件内拍摄视频快照

C# 在webbrowser控件内拍摄视频快照,c#,.net,winforms,webbrowser-control,screen-capture,C#,.net,Winforms,Webbrowser Control,Screen Capture,我正在使用windows窗体获取一个包含摄像头视频的网站,然后在此网站上捕获图像 我正在使用 webbrowser1.DrawToBitMap(bitmap, bitmapRect) 但图像显示为全白色。然后我试着从另一个网站(例如:google.com)捕捉图像,这个方法非常有效。所以我认为这可能是因为这种方法无法捕捉视频。所以我的问题是,我们有没有办法通过网络浏览器控制在网站上捕捉视频? 这是我嵌入相机视频的代码 <object classid="clsid:02BF25D5

我正在使用windows窗体获取一个包含摄像头视频的网站,然后在此网站上捕获图像
我正在使用

webbrowser1.DrawToBitMap(bitmap, bitmapRect)
但图像显示为全白色。然后我试着从另一个网站(例如:google.com)捕捉图像,这个方法非常有效。所以我认为这可能是因为这种方法无法捕捉视频。所以我的问题是,我们有没有办法通过网络浏览器控制在网站上捕捉视频?
这是我嵌入相机视频的代码

    <object classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" width="704" height="592" codebase="http://www.apple.com/qtactivex/qtplugin.cab">
    <param name="src" value="empty.mov">
    <param name="autoplay" value="true">
    <param name="controller" value="false">
    <param name="qtsrc" value="rtsp://<link>">
    <embed src="empty.mov" width="704" height="592" qtsrc="rtsp://<link>" autoplay="true" controller="false" target="myself" pluginspage="http://www.apple.com/quicktime/download/">
</object>

之所以会发生这种情况,是因为页面中的视频框不是由web浏览器呈现的,而是由quick time插件呈现的。因此,web浏览器没有该区域的图形内容信息。它会画出一个空白框

现在,唯一了解屏幕上所有图形内容的人就是
屏幕本身。所以您可以尝试
Graphics.CopyFromScreen
方法。但它也有一些缺点。这一次,它将捕获屏幕上的所有内容,包括任务栏和标题栏。其次,它将只捕获页面的可见部分。如果页面需要滚动,或者你需要完整的页面截图,那么我们就有问题了

不过我们可以有变通办法。通过仔细计算整个屏幕的矩形区域,可以裁剪任务栏/标题栏。同样,页面可以通过编程方式滚动、重新捕获,并将图像连接到完整的页面视图


至于实际的实现,我对从屏幕上捕获完美大小的矩形相当乐观。如果你要求的话,我可以帮助你编写代码。先试试()。至于scroll capture join的第二部分,我相信这会非常乏味,但可以实现。

此页面使用Apple的Quick Time ActiveX控件进行视频播放。最可能的情况是,控件使用DirectX,不响应
WM_PRINT
消息(由
WebBrowser.DrawToBitMap
内部使用)。虽然我认为成功的机会很低,但您可以尝试其他一些方法,特别是
WebBrowser
(即,在全屏捕获环境之外):

  • 启用
    WebBrowser
    功能()。继续前进
  • 禁用
    WebBrowser
    功能
  • 尝试API而不是
    DrawToBitMap
    ,将
    WebBrowser.ActiveXInstance
    作为
    pUnknown
    参数传递
  • 获取
    WebBrowser.Document.Body.doElement
    ,请求并重试。这个甚至可以用

如果他把两者都混合在一起,他应该是好的。使用
屏幕
抓取真正可见的东西,然后点击浏览器快照。匹配像素以对齐所有内容并仅使浏览器框可见。有一些代码可以找到两张图片之间的匹配,并可以将它们相互对齐,如果其中一张图片的比例不同,也可以使用。我以前用过。还有一个PHP图形库可以做到这一点。通过使用CopyFromScreen,我可以捕获全屏;然而,我上面提到的相机是另一种形式,我试图只捕获该形式,但我不能,这是获取全屏的代码
int screenX=Screen.PrimaryScreen.Bounds.X;int screenY=Screen.PrimaryScreen.Bounds.Y;位图bmpScreenShot=新位图(Screen.PrimaryScreen.Bounds.Width、Screen.PrimaryScreen.Bounds.Height、PixelFormat.Format32bppArgb);Graphics gfxScreenShot=Graphics.FromImage(bmpScreenShot);gfxScreenShot=Graphics.FromImage(bmpScreenShot);gfxScreenShot.CopyFromScreen(screenX,screenY,0,0,Screen.PrimaryScreen.Bounds.Size,CopyPixelOperation.SourceCopy);bmpScreenShot.Save(name+“.png”);