【问题标题】:Getting black screen shot using screen capture method in c#在c#中使用截屏方法获取黑屏
【发布时间】:2016-05-11 09:50:10
【问题描述】:

我在我的 c# 中使用屏幕捕获方法。在本地项目中,一切正常。但是当我将我的应用程序发布到实时域时,我会收到黑屏。

我正在使用以下两种方式进行活动窗口屏幕捕获 1)http://www.tutorialized.com/tutorial/How-to-capture-web-page-screenshot-in-asp.net-using-c/67952 2)http://www.c-sharpcorner.com/article/screen-capture-and-save-as-an-image/

以上方法在本地项目中运行良好。但是在发布屏幕截图后保存到驱动器中但得到黑色(空)。

您的回答将不胜感激。

【问题讨论】:

  • 你有一个 XY 问题。您不能也不应该希望从服务器截取浏览器的屏幕截图。你为什么要这样做?
  • 在我的网页中有一个 iframe。和来自第 3 方网站的 iframe。我在框架中没有任何控件,只有我可以在某些控件中添加值。所以对于我的日志,我想捕获附加值并将其存储为图像。现在告诉我从 mvc 应用程序中最好的方法是什么。您还可以阅读下面的答案 cmets 以获得更多说明。
  • 当您尝试在服务器端捕获桌面时,您正在尝试捕获服务器桌面。但是,Web 服务器没有桌面,这就是您得到黑色图像的原因。您无法使用服务器代码捕获用户浏览器的屏幕截图。
  • @JatinGadhiya 发布了一个不同的问题,询问您真正想要做什么。实际上,实际问题隐藏在第 6 条评论中,可读性不强。在任何情况下,在浏览器上做任何事情都涉及到 Javascript、浏览器扩展或 Flash
  • @JatinGadhiya 发布了一个问题。原文没有任何帮助。事实上,您可能会问“如何使用 Javascript 捕获屏幕截图?”。如果您对此感兴趣,那么第一个答案之一是this SO question - Using HTML5/Canvas/JavaScript to take screenshots,它指向html2canvas

标签: c# asp.net screen-capture


【解决方案1】:

这些项目旨在用于桌面环境,而不是网页(第一个链接上的项目完全错误!)。

你得到一个黑屏是因为你捕获了应用程序运行的屏幕,所以你得到了服务器的屏幕,如果没有用户登录,屏幕就是黑屏!

您不能使用此代码来捕获远程 Web 客户端屏幕。

尝试改用 WebBrowser 控件并将结果呈现在位图上:

<asp:TextBox ID="txtUrl" runat="server" Text = "" />
<asp:Button Text="Capture" runat="server" OnClick="Capture" />
<br />
<asp:Image ID="imgScreenShot" runat="server" Height="300" Width="400" Visible = "false" />

代码隐藏:

using System.IO;
using System.Drawing;
using System.Threading;
using System.Windows.Forms;
protected void Capture(object sender, EventArgs e)
{
    string url = txtUrl.Text.Trim();
    Thread thread = new Thread(delegate()
    {
        using (WebBrowser browser = new WebBrowser())
        {
            browser.ScrollBarsEnabled = false;
            browser.AllowNavigation = true;
            browser.Navigate(url);
            browser.Width = 1024;
            browser.Height = 768;
            browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(DocumentCompleted);
            while (browser.ReadyState != WebBrowserReadyState.Complete)
            {
                System.Windows.Forms.Application.DoEvents();
            }
        }
    });
    thread.SetApartmentState(ApartmentState.STA);
    thread.Start();
    thread.Join();
}

private void DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    WebBrowser browser = sender as WebBrowser;
    using (Bitmap bitmap = new Bitmap(browser.Width, browser.Height))
    {
        browser.DrawToBitmap(bitmap, new Rectangle(0, 0, browser.Width, browser.Height));
        using (MemoryStream stream = new MemoryStream())
        {
            bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
            byte[] bytes = stream.ToArray();
            imgScreenShot.Visible = true;
            imgScreenShot.ImageUrl = "data:image/png;base64," + Convert.ToBase64String(bytes);
        }
    }
}

【讨论】:

  • Giox 感谢您的回答。那么您能否建议我使用 Web 应用程序(mvc)捕获当前屏幕窗口的方法。我也尝试过使用 html2canvas。它也可以正常工作..但它不支持 iframe 内容。
  • 试试编辑中发布的代码,它不是 MVC,因为我不太擅长,但你可以轻松转换它
  • 在我的 Web 应用程序中还有一件事我正在用 ajax 做很多事情。所以如果我传递 url 那么它对我不起作用。因为如果页面重新加载,我将失去价值。因此,我希望使用我的新 ajax 调用捕获当前屏幕上的任何显示。
  • Giox,他们有什么方法可以在不传递当前页面 url 的情况下获得活动屏幕作为 Web 应用程序上的图像?
  • 你在嗅探用户信息吗??框架必须在同一个域中。这是一个安全策略
【解决方案2】:

实际的问题似乎是“如何使用 Javascript 捕获屏幕截图”?这已经在之前的 SO 问题Using HTML5/Canvas/JavaScript to take screenshots 中得到解答。答案使用html2canvas 库来读取页面的 DOM 并使用 Canvas 呈现图像。

例如,以下代码将捕获当前页面并将结果发布到页面底部:

html2canvas(document.body, {
  onrendered: function(canvas) {
    document.body.appendChild(canvas);
  }
});

要渲染不同的元素,请将其传递给 html2canvas 而不是 document.body

html2canvas(someElement,...);

虽然呈现 IFRAME 可能是个问题,因为它的内容不是页面的一部分,因此也是 DOM。 Javascript 根本无法访问其内容。这是answered in this SO question,作为html2canvas 的限制提及。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-04
    • 1970-01-01
    • 1970-01-01
    • 2017-10-03
    • 1970-01-01
    • 2016-04-28
    相关资源
    最近更新 更多