这是很早以前一个项目的外挂,但是今天有时间就做一下整理。核心功能是基于《Get ASP.NET C# 2.0 Website Thumbnail Screenshot》其原理也非常简单,利用WebBrowser加载网页,完成调用DrawToBitmap即可,故而需要引用:System.Windows.Forms程序集。

线程问题

虽然利用WebBrowser在Win Form下没有什么问题,但如果在ASP.NET下就不行,因为这涉及到单线程和多线程问题。我们说利用WebBrowser加载网页,但前提是必须等待DocumentCompleted事件被调用。

这里的办法是重新强制创建一个新单元线程SetApartmentState(ApartmentState.STA)

范例

1、引用 (ClassWSThumb)[http://pan.baidu.com/s/1eQIaKCU]。

2、在HomeController创建2个Action:Index、GetThumb

以下是Index View的核心代码

<input type="url" id="J_Url" value="http://www.baidu.com" />
<button type="button" id="J_GetThumb">获取缩略图</button><br />
<p id="J_Status"></p>
<img id="J_Priview" />
<script>
    $("#J_GetThumb").click(function () {
        $("#J_Status").text("加载中...");
        $("#J_Priview").fadeOut(1000);
        $("#J_Priview").attr("src", "/home/GetThumb?Url=" + $("#J_Url").val()).load(function () {
            $("#J_Status").text("完成");
            $("#J_Priview").fadeIn(1000);
        });
    });
</script>

以下是Index View的核心代码

        public ActionResult GetThumb(string Url)
        {
            Bitmap _Bitmap = ClassWSThumb.GetWebSiteThumbnail(Url, 1024, 768, 300, 300);
            MemoryStream ms = new MemoryStream();
            if (_Bitmap != null)
                _Bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
            else
                System.Drawing.Image.FromFile(Server.MapPath("~/NoPriview.jpg")).Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
            return File(ms.ToArray(), "image/jpg");
        }

源码下载