ASP.NET实现根据URL生成网页缩略图的方法

时间:2022-10-07 13:24:07

本文实例讲述了ASP.NET实现根据URL生成网页缩略图的方法。分享给大家供大家参考,具体如下:

工作中需要用到根据URL生成网页缩略图功能,提前做好准备。

在网上找了份源码,但是有错误:当前线程不在单线程单元中,因此无法实例化 ActiveX 控件“8856f961-340a-11d0-a9”,解决后运行良好,记录在此备用!

起始页:Default.aspx

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="CaptureToImage._Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
 <title>Snap</title>
</head>
<body>
 <form id="form1" runat="server">
 <div>
 <input type="button" onclick="window.open('Snap.aspx?url=www.njude.com.cn')" value="生成网页缩略图"/>
 </div>
 </form>
</body>
</html>

调用页:Snap.aspx

?
1
2
3
4
5
6
7
8
9
10
11
12
13
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Snap.aspx.cs" Inherits="CaptureToImage.Snap" AspCompat="true" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
 <title>无标题页</title>
</head>
<body>
 <form id="form1" runat="server">
 <div>
 </div>
 </form>
</body>
</html>

PS:红色字体部分是为解决错误增加的代码,强制程序在单线程环境下运行!

调用页:Snap.aspx.cs

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Drawing.Imaging;
namespace CaptureToImage
{
 public partial class Snap : System.Web.UI.Page
 {
  protected void Page_Load(object sender, EventArgs e)
  {
   string url = string.Empty;
   url = Request.QueryString[0];
   try
   {
    GetImage thumb = new GetImage(url, 1024, 768, 800, 600);
    System.Drawing.Bitmap x = thumb.GetBitmap();
    x.Save(Response.OutputStream, ImageFormat.Jpeg);
    Response.ContentType = "image/jpeg";
   }
   catch (Exception ex)
   {
    Response.Write(ex.Message);
   }
  }
 }
}

类文件:GetImage.cs

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Windows.Forms;
using System.Web.UI;
namespace CaptureToImage
{
 public class GetImage
 {
  int S_Height;
  int S_Width;
  int F_Height;
  int F_Width;
  string MyURL;
  public int ScreenHeight
  {
   get
   {
    return S_Height;
   }
   set
   {
    S_Height = value;
   }
  }
  public int ScreenWidth
  {
   get
   {
    return S_Width;
   }
   set
   {
    S_Width = value;
   }
  }
  public int ImageHeight
  {
   get
   {
    return F_Height;
   }
   set
   {
    F_Height = value;
   }
  }
  public int ImageWidth
  {
   get
   {
    return F_Width;
   }
   set
   {
    F_Width = value;
   }
  }
  public string WebSite
  {
   get
   {
    return MyURL;
   }
   set
   {
    MyURL = value;
   }
  }
  public GetImage(string WebSite, int ScreenWidth, int ScreenHeight, int ImageWidth, int ImageHeight)
  {
   this.WebSite = WebSite;
   this.ScreenHeight = ScreenHeight;
   this.ScreenWidth = ScreenWidth;
   this.ImageHeight = ImageHeight;
   this.ImageWidth = ImageWidth;
  }
  [STAThread]
  public Bitmap GetBitmap()
  {
   WebPageBitmap Shot = new WebPageBitmap(this.WebSite, this.ScreenWidth, this.ScreenHeight);
   Shot.GetIt();
   Bitmap Pic = Shot.DrawBitmap(this.ImageHeight, this.ImageWidth);
   return Pic;
  }
 }
 public class WebPageBitmap
 {
  WebBrowser MyBrowser;
  string URL;
  int Height;
  int Width;
  public WebPageBitmap(string url, int width, int height)
  {
   this.URL = url;
   this.Width = width;
   this.Height = height;
   MyBrowser = new WebBrowser();
   MyBrowser.ScrollBarsEnabled = false;
   MyBrowser.Size = new Size(this.Width, this.Height);
  }
  public void GetIt()
  {
   NavigateUrl(this.URL);
   while (MyBrowser.ReadyState != WebBrowserReadyState.Complete)
   {
    Application.DoEvents();
   }
  }
  public delegate void DelUserHandler(string url);
  public void NavigateUrl(string url)
  {
   try
   {
    if (this.MyBrowser.InvokeRequired)
    {
     DelUserHandler handler = new DelUserHandler(NavigateUrl);
     MyBrowser.Invoke(handler, url);
    }
    else
    {
     this.MyBrowser.Navigate(url);
    }
   }
   catch (Exception ex)
   {
    throw new Exception("NavigateUrl()" + ex.Message);
   }
  }
  public Bitmap DrawBitmap(int theight, int twidth)
  {
   Bitmap myBitmap = new Bitmap(this.Width, this.Height);
   Rectangle DrawRect = new Rectangle(0, 0, this.Width, this.Height);
   MyBrowser.DrawToBitmap(myBitmap, DrawRect);
   System.Drawing.Image imgOutput = myBitmap;
   System.Drawing.Bitmap oThumbNail = new Bitmap(twidth, theight, imgOutput.PixelFormat);
   Graphics g = Graphics.FromImage(oThumbNail);
   g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighSpeed;
   g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighSpeed;
   g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBilinear;
   Rectangle oRectangle = new Rectangle(0, 0, twidth, theight);
   g.DrawImage(imgOutput, oRectangle);
   try
   {
    return oThumbNail;
   }
   catch
   {
    return null;
   }
   finally
   {
    imgOutput.Dispose();
    imgOutput = null;
    MyBrowser.Dispose();
    MyBrowser = null;
   }
  }
 }
}

PS:项目中需要添加引用System.Windows.Forms

希望本文所述对大家asp.net程序设计有所帮助。