今天无意见看到浏览器有将网页生成图片的功能,顿时赶脚很好奇,于是就找了找资料自己做了一个类似的功能。
工具截图:
生成后的图片
手动填写网站地址,可选择图片类型和保持图片地址,来生成页面的图片,当图片路径未选择时则保存桌面;
具体代码如下:
将html生成图片的类
1 using System;
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Data;
5 using System.Drawing;
6 using System.Text;
7 using System.Windows.Forms;
8 using System.Drawing.Imaging;
9 using System.Runtime.InteropServices;
10 using System.Security;
11 namespace Print
12 {
13 public class Test
14 {
15 public static Bitmap GetHtmlImage(Uri UrlString, int Width)
16 {
17 WebBrowser MyControl = new WebBrowser();
18 MyControl.Size = new Size(Width, 10);
19 MyControl.Url = UrlString;
20 while (MyControl.ReadyState != WebBrowserReadyState.Complete)
21 {
22 Application.DoEvents();
23 }
24 MyControl.Height = MyControl.Document.Body.ScrollRectangle.Height + 20;
25 MyControl.Url = UrlString;
26 WebControlImage.Snapshot snap = new WebControlImage.Snapshot();
27 Bitmap MyImage = snap.TakeSnapshot(MyControl.ActiveXInstance, new Rectangle(0, 0, MyControl.Width, MyControl.Height));
28 MyControl.Dispose();
29 return MyImage;
30 }
31 ///
32 /// WebBrowser获取图形
33 ///
34 private class WebControlImage
35 {
36 internal static class NativeMethods
37 {
38 [StructLayout(LayoutKind.Sequential)]
39 public sealed class tagDVTARGETDEVICE
40 {
41 [MarshalAs(UnmanagedType.U4)]
42 public int tdSize;
43 [MarshalAs(UnmanagedType.U2)]
44 public short tdDriverNameOffset;
45 [MarshalAs(UnmanagedType.U2)]
46 public short tdDeviceNameOffset;
47 [MarshalAs(UnmanagedType.U2)]
48 public short tdPortNameOffset;
49 [MarshalAs(UnmanagedType.U2)]
50 public short tdExtDevmodeOffset;
51 }
52 [StructLayout(LayoutKind.Sequential)]
53 public class COMRECT
54 {
55 public int left;
56 public int top;
57 public int right;
58 public int bottom;
59 public COMRECT()
60 {
61 }
62 public COMRECT(Rectangle r)
63 {
64 this.left = r.X;
65 this.top = r.Y;
66 this.right = r.Right;
67 this.bottom = r.Bottom;
68 }
69 public COMRECT(int left, int top, int right, int bottom)
70 {
71 this.left = left;
72 this.top = top;
73 this.right = right;
74 this.bottom = bottom;
75 }
76 public static NativeMethods.COMRECT FromXYWH(int x, int y, int width, int height)
77 {
78 return new NativeMethods.COMRECT(x, y, x + width, y + height);
79 }
80 public override string ToString()
81 {
82 return string.Concat(new object[] { "Left = ", this.left, " Top ", this.top, " Right = ", this.right, " Bottom = ", this.bottom });
83 }
84 }
85 [StructLayout(LayoutKind.Sequential)]
86 public sealed class tagLOGPALETTE
87 {
88 [MarshalAs(UnmanagedType.U2)]
89 public short palVersion;
90 [MarshalAs(UnmanagedType.U2)]
91 public short palNumEntries;
92 }
93 }
94 public class Snapshot
95 {
96 ///
97 /// ?煺?
98 ///
99 /// Com 对象
100 /// 图象大小
101 ///
102 public Bitmap TakeSnapshot(object pUnknown, Rectangle bmpRect)
103 {
104 if (pUnknown == null)
105 return null;
106 //必须为com对象
107 if (!Marshal.IsComObject(pUnknown))
108 return null;
109 //IViewObject 接口
110 UnsafeNativeMethods.IViewObject ViewObject = null;
111 IntPtr pViewObject = IntPtr.Zero;
112 //内存图
113 Bitmap pPicture = new Bitmap(bmpRect.Width, bmpRect.Height);
114 Graphics hDrawDC = Graphics.FromImage(pPicture);
115 //获取接口
116 object hret = Marshal.QueryInterface(Marshal.GetIUnknownForObject(pUnknown),
117 ref UnsafeNativeMethods.IID_IViewObject, out pViewObject);
118 try
119 {
120 ViewObject = Marshal.GetTypedObjectForIUnknown(pViewObject, typeof(UnsafeNativeMethods.IViewObject)) as UnsafeNativeMethods.IViewObject;
121 //调用Draw方法
122 ViewObject.Draw((int)System.Runtime.InteropServices.ComTypes.DVASPECT.DVASPECT_CONTENT,
123 -1,
124 IntPtr.Zero,
125 null,
126 IntPtr.Zero,
127 hDrawDC.GetHdc(),
128 new NativeMethods.COMRECT(bmpRect),
129 null,
130 IntPtr.Zero,
131 0);
132 }
133 catch (Exception ex)
134 {
135 Console.WriteLine(ex.Message);
136 throw ex;
137 }
138 //释放
139 hDrawDC.Dispose();
140 return pPicture;
141 }
142 }
143 [SuppressUnmanagedCodeSecurity]
144 internal static class UnsafeNativeMethods
145 {
146 public static Guid IID_IViewObject = new Guid("{0000010d-0000-0000-C000-000000000046}");
147 [ComImport, Guid("0000010d-0000-0000-C000-000000000046"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
148 public interface IViewObject
149 {
150 [PreserveSig]
151 int Draw([In, MarshalAs(UnmanagedType.U4)] int dwDrawAspect, int lindex, IntPtr pvAspect, [In] NativeMethods.tagDVTARGETDEVICE ptd, IntPtr hdcTargetDev, IntPtr hdcDraw, [In] NativeMethods.COMRECT lprcBounds, [In] NativeMethods.COMRECT lprcWBounds, IntPtr pfnContinue, [In] int dwContinue);
152 [PreserveSig]
153 int GetColorSet([In, MarshalAs(UnmanagedType.U4)] int dwDrawAspect, int lindex, IntPtr pvAspect, [In] NativeMethods.tagDVTARGETDEVICE ptd, IntPtr hicTargetDev, [Out] NativeMethods.tagLOGPALETTE ppColorSet);
154 [PreserveSig]
155 int Freeze([In, MarshalAs(UnmanagedType.U4)] int dwDrawAspect, int lindex, IntPtr pvAspect, [Out] IntPtr pdwFreeze);
156 [PreserveSig]
157 int Unfreeze([In, MarshalAs(UnmanagedType.U4)] int dwFreeze);
158 void SetAdvise([In, MarshalAs(UnmanagedType.U4)] int aspects, [In, MarshalAs(UnmanagedType.U4)] int advf, [In, MarshalAs(UnmanagedType.Interface)] System.Runtime.InteropServices.ComTypes.IAdviseSink pAdvSink);
159 void GetAdvise([In, Out, MarshalAs(UnmanagedType.LPArray)] int[] paspects, [In, Out, MarshalAs(UnmanagedType.LPArray)] int[] advf, [In, Out, MarshalAs(UnmanagedType.LPArray)] System.Runtime.InteropServices.ComTypes.IAdviseSink[] pAdvSink);
160 }
161 }
162 }
163 }
164 }
winfrom后台处理方面代码如下
1 using System;
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Data;
5 using System.Drawing;
6 using System.Linq;
7 using System.Text;
8 using System.Windows.Forms;
9 using System.Drawing.Imaging;
10
11 namespace Excel文件处理
12 {
13 public partial class Html : Form
14 {
15 public Html()
16 {
17 InitializeComponent();
18 }
19 private string ImageUrl = "";//图片地址
20 private string ImageName = "";//图片名称
21 private void button1_Click(object sender, EventArgs e)
22 {
23 string HtmlUrl = this.Txt_Url.Text.Trim();
24 if (HtmlUrl=="")
25 {
26 MessageBox.Show("请输入网址");
27 return;
28 }
29 if (ImageUrl.Trim()=="")
30 {
31 ImageUrl = @"C:UsersAdministratorDesktop";
32 }
33 try
34 {
35 Uri ri = new Uri(this.Txt_Url.Text);
36 Bitmap bit = Print.Test.GetHtmlImage(ri, 1200);
37 ImageName = this.Txt_Name.Text.Trim();//图片名称
38 if (ImageName != "")
39 {
40 if (ImageName.IndexOf('.') != -1)
41 {//当用户输入图片后缀时,将后缀截取
42 ImageName.Substring(0, ImageName.LastIndexOf('.'));
43 }
44 }
45 else
46 ImageName = DateTime.Now.Ticks.ToString();//时间名称
47 switch (this.comboBox1.SelectedText)
48 {
49 case "GIF": ImageUrl += "\" + ImageName + ".gif"; break;
50 case "JPG": ImageUrl += "\" + ImageName + ".jpg"; break;
51 case "PNG": ImageUrl += "\" + ImageName + ".png"; break;
52 default: ImageUrl += "\" + ImageName + ".png"; break;
53 }
54
55 switch (this.comboBox1.SelectedText)
56 {
57 case "GIF": bit.Save(ImageUrl, ImageFormat.Gif); break;
58 case "JPG": bit.Save(ImageUrl, ImageFormat.Jpeg); break;
59 case "PNG": bit.Save(ImageUrl, ImageFormat.Png); break;
60 default: bit.Save(ImageUrl, ImageFormat.Png); break;
61 }
62
63 bit = null;
64 ImageUrl = "";//图片地址
65 ImageName = "";//图片名称
66 MessageBox.Show("生产成功");
67 }
68 catch
69 {
70 MessageBox.Show("网址输入有误!");
71 return;
72 }
73
74 }
75
76 private void button2_Click(object sender, EventArgs e)
77 {
78 //获取保存路径
79 if (this.folderBrowserDialog1.ShowDialog()==DialogResult.OK)
80 {
81 if (this.folderBrowserDialog1.SelectedPath.Trim()!="")
82 {
83 ImageUrl = folderBrowserDialog1.SelectedPath;
84 this.label6.Text = ImageUrl;
85 }
86 }
87
88 }
89 }
90 }
