65.9K
CodeProject 正在变化。 阅读更多。
Home

如何在没有窗体(控制台)的 C# 应用程序中获取网站缩略图

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.66/5 (13投票s)

2006 年 11 月 17 日

CPOL

3分钟阅读

viewsIcon

176460

downloadIcon

6

这篇文章描述了如何在 .NET Framework 2.0+ 中获取网站的缩略图,而无需启动完全交互式的 WinForms 应用程序。

更新

我使用 Piers Lawson 在评论中建议的改进更新了代码和二进制文件。该应用程序应该不再有截取某些带有 JavaScript 的图像或纯粹随机问题的麻烦。它还根据 Frank Herget 的建议进行了稍微的优化。 看起来他以此为基础建立了一个非常好的服务 在他的网站上 - 看看吧!

再次感谢您的鼎力支持!

引言

这篇文章描述了一个类似控制台的应用程序,该应用程序加载网页,对其进行截图并将其保存为 JPG 文件。

我们敬爱的系统管理员 - (我们都向他鞠躬并敬佩他的技能)最近问是否有可能编写一个 .NET 应用程序来制作网站的缩略图。 实际上,使用 Windows Forms,这个任务非常简单。 但考虑到他是 Linux 专家等等……我决定选择更具挑战性的部分,即控制台应用程序。 无论如何,这是一个有趣的应用案例。

在 WinForms 中,您真正需要做的就是从工具箱中拖一个 WebBrowser 到您的窗体上,一旦它加载了页面,就调用

Bitmap bitmap = new Bitmap(width, height);
webBrowser1.DrawToBitmap(bitmap, 
    new Rectangle(webBrowser1.Location.X, webBrowser1.Location.Y, 
        webBrowser1.Width, webBrowser1.Height));

很明显。 当您希望以可以批量截取批处理文件中提供的多个网站的方式在控制台应用程序中执行此操作时,就会变得棘手。 有一种不好的方法是实例化整个窗体,让它显示(或不显示),完成工作,然后退出 WinForms 应用程序。 这对于快速解决方案来说可能足够了,但我想要干净的代码,所以我实际上不会为此感到自豪。

那应该怎么做呢…

因此,我们在类构造函数中实例化 Web 控件...

public WebPageBitmap(string url, int width, int height, bool scrollBarsEnabled)
{
    this.url = url;
    this.width = width;
    this.height = height;
    webBrowser = new WebBrowser();
    webBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(documentCompletedEventHandler);
    webBrowser.Size = new Size(width, height);
    webBrowser.ScrollBarsEnabled = scrollBarsEnabled;
}

到目前为止,这很简单,而且与普通应用程序所做的非常相似。 documentCompletedEventHandler 是一个 委托,用于指示它已加载。(我最初想用它来绘制位图,但将其推迟到调整大小部分添加后实际获取位图的时候。)现在是有趣的情况。

整洁的部分

由于调用是异步的,简单的 webBrowser.Navigate(URL); 就不行了。 我们在一个线程中,并且浏览器没有为此创建单独的线程。 这符合规范的 Windows 规则:只有创建控件的线程才能访问控件。 我们需要以某种方式允许控件获取线程的流程并完成其工作。 导航只是告诉它应该执行该操作,并立即退出。 然后开发人员的责任是知道控件何时可以被使用。 当 webBrowser.ReadyState 进展到(或返回到)WebBrowserReadyState.Complete 状态时就是这种情况。

解决方案

要将流程传递给应用程序控件,您需要执行 Application.DoEvents();,当我使用它时,这有点出乎意料。 令人惊讶的是,它的工作方式就像我在之前使用的其他 Windows 框架中一样。

public void Fetch()
{
    webBrowser.Navigate(url);
        while (webBrowser.ReadyState != WebBrowserReadyState.Complete)
        {
            Application.DoEvents();
        }
}

效果是一个小巧而整洁(我希望如此)的应用程序,它从网络上提取一个网页并截取其屏幕截图(可能进行缩放)。

您可以获取源代码或直接获取应用程序。 应用程序使用

GetSiteThumbnail.exe http://www.yoursite.com/ thumbnail.jpg 
  [browser_width(defaults to 800) browser_height (defaults to 600) ] 
  [thumbnail_width thumbnail_height]

Sample:
GetSiteThumbnail.exe http://www.cognifide.com/ cognifide.jpg 1280 1024 640 480
© . All rights reserved.