首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用MVC为网站截图?

如何使用MVC为网站截图?
EN

Stack Overflow用户
提问于 2013-06-27 23:38:47
回答 3查看 5.9K关注 0票数 2

我正在努力寻找一种在MVC4中截取网站截图的方法。我已经看到了两种可能的解决方案,它们都不适合MVC。

第一个是使用WebBrowser,教程找到了here,但这给了我一个ActiveX control '8856f961-340a-11d0-a96b-00c04fd705a2' cannot be instantiated because the current thread is not in a single-threaded apartment错误。

另一种是使用名为Grabz.It的第三方,但我还没有找到将其集成到MVC中的方法。

还有其他想法/解决方案吗?

谢谢。

EN

回答 3

Stack Overflow用户

发布于 2013-06-28 01:08:33

考虑到您的其他详细信息,您应该能够使用任意数量的工具来完成此操作。CodeCaster的想法很好,PhantomJS还提供了类似的基于webkit的任意url (https://github.com/ariya/phantomjs/wiki/Screen-Capture)图像生成。它提供了多个输出格式选项,如PNG、JPG、GIF和PDF。

由于PhantomJS使用的是WebKit,一个真正的布局和渲染引擎,它可以捕获一个网页作为屏幕截图。因为PhantomJS可以呈现网页上的任何内容,所以它不仅可以用来转换HTML和CSS格式的内容,还可以转换SVG和Canvas格式的内容。

您可能需要从您的MVC应用程序中执行phantomjs.exe应用程序,或者更好的做法是由一些在幕后运行的服务来处理提交的urls队列。

票数 3
EN

Stack Overflow用户

发布于 2013-06-27 23:48:41

为什么你想把它集成到MVC中?你的网站有责任为其他网站截图吗?我会选择在一个单独的库中创建截图逻辑,例如,作为Windows服务托管。

WebBrowser控件需要在UI线程上运行,这是服务(如IIS)所不具备的。不过,您可以尝试其他库。

例如,您可以围绕wkhtmltopdf编写一些代码,使用WebKit引擎将HTML呈现为PDF (顾名思义)。

票数 1
EN

Stack Overflow用户

发布于 2015-10-26 20:21:31

您需要指定线程处于STA (单线程单元模式,以便实例化web浏览器)。

代码语言:javascript
复制
public ActionResult Save()
{
    var url = "http://www.google.co.uk";

    FileContentResult result = null;
    Bitmap bitmap = null;

    var thread = new Thread(
    () =>
    {
        bitmap = ExportUrlToImage(url, 1280, 1024);
    });

    thread.SetApartmentState(ApartmentState.STA); //Set the thread to STA
    thread.Start();
    thread.Join();

    if (bitmap != null)
    {
        using (var memstream = new MemoryStream())
        {
            bitmap.Save(memstream, ImageFormat.Jpeg);
            result = this.File(memstream.GetBuffer(), "image/jpeg");
        }
    }

    return result;
}

private Bitmap ExportUrlToImage(string url, int width, int height)
{
    // Load the webpage into a WebBrowser control
    WebBrowser wb = new WebBrowser();
    wb.ScrollBarsEnabled = false;
    wb.ScriptErrorsSuppressed = true;

    wb.Navigate(url);
    while (wb.ReadyState != WebBrowserReadyState.Complete)
    {
            Application.DoEvents();
    }

    // Set the size of the WebBrowser control
    wb.Width = width;
    wb.Height = height;

    Bitmap bitmap = new Bitmap(wb.Width, wb.Height);
    wb.DrawToBitmap(bitmap, new System.Drawing.Rectangle(0, 0, wb.Width, wb.Height));
    wb.Dispose();

    return bitmap;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17347451

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档