-
C#教程之Winform实现将网页生成图片的方法
通常浏览器都有将网页生成图片的功能,本文实例讲述了Winform实现将网页生成图片的方法。分享给大家供大家参考。具体方法如下:
工具截图如下:
生成后的图片如下:
手动填写网站地址,可选择图片类型和保持图片地址,来生成页面的图片,当图片路径未选择时则保存桌面;
具体代码如下:
将html生成图片的类
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
161
162
163
164
|
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Drawing.Imaging; using System.Runtime.InteropServices; using System.Security; namespace Print { public class Test { public static Bitmap GetHtmlImage(Uri UrlString, int Width) { WebBrowser MyControl = new WebBrowser(); MyControl.Size = new Size(Width, 10); MyControl.Url = UrlString; while (MyControl.ReadyState != WebBrowserReadyState.Complete) { Application.DoEvents(); } MyControl.Height = MyControl.Document.Body.ScrollRectangle.Height + 20; MyControl.Url = UrlString; WebControlImage.Snapshot snap = new WebControlImage.Snapshot(); Bitmap MyImage = snap.TakeSnapshot(MyControl.ActiveXInstance, new Rectangle(0, 0, MyControl.Width, MyControl.Height)); MyControl.Dispose(); return MyImage; } /// /// WebBrowser获取图形 /// private class WebControlImage { internal static class NativeMethods { [StructLayout(LayoutKind.Sequential)] public sealed class tagDVTARGETDEVICE { [MarshalAs(UnmanagedType.U4)] public int tdSize; [MarshalAs(UnmanagedType.U2)] public short tdDriverNameOffset; [MarshalAs(UnmanagedType.U2)] public short tdDeviceNameOffset; [MarshalAs(UnmanagedType.U2)] public short tdPortNameOffset; [MarshalAs(UnmanagedType.U2)] public short tdExtDevmodeOffset; } [StructLayout(LayoutKind.Sequential)] public class COMRECT { public int left; public int top; public int right; public int bottom; public COMRECT() { } public COMRECT(Rectangle r) { this .left = r.X; this .top = r.Y; this .right = r.Right; this .bottom = r.Bottom; } public COMRECT( int left, int top, int right, int bottom) { this .left = left; this .top = top; this .right = right; this .bottom = bottom; } public static NativeMethods.COMRECT FromXYWH( int x, int y, int width, int height) { return new NativeMethods.COMRECT(x, y, x + width, y + height); } public override string ToString() { return string .Concat( new object [] { "Left = " , this .left, " Top " , this .top, " Right = " , this .right, " Bottom = " , this .bottom }); } } [StructLayout(LayoutKind.Sequential)] public sealed class tagLOGPALETTE { [MarshalAs(UnmanagedType.U2)] public short palVersion; [MarshalAs(UnmanagedType.U2)] public short palNumEntries; } } public class Snapshot { /// /// ?煺? /// /// Com 对象 /// 图象大小 /// public Bitmap TakeSnapshot( object pUnknown, Rectangle bmpRect) { if (pUnknown == null ) return null ; //必须为com对象 if (!Marshal.IsComObject(pUnknown)) return null ; //IViewObject 接口 UnsafeNativeMethods.IViewObject ViewObject = null ; IntPtr pViewObject = IntPtr.Zero; //内存图 Bitmap pPicture = new Bitmap(bmpRect.Width, bmpRect.Height); Graphics hDrawDC = Graphics.FromImage(pPicture); //获取接口 object hret = Marshal.QueryInterface(Marshal.GetIUnknownForObject(pUnknown), ref UnsafeNativeMethods.IID_IViewObject, out pViewObject); try { ViewObject = Marshal.GetTypedObjectForIUnknown(pViewObject, typeof (UnsafeNativeMethods.IViewObject)) as UnsafeNativeMethods.IViewObject; //调用Draw方法 ViewObject.Draw(( int )System.Runtime.InteropServices.ComTypes.DVASPECT.DVASPECT_CONTENT, -1, IntPtr.Zero, null , IntPtr.Zero, hDrawDC.GetHdc(), new NativeMethods.COMRECT(bmpRect), null , IntPtr.Zero, 0); } catch (Exception ex) { Console.WriteLine(ex.Message); throw ex; } //释放 hDrawDC.Dispose(); return pPicture; } } [SuppressUnmanagedCodeSecurity] internal static class UnsafeNativeMethods { public static Guid IID_IViewObject = new Guid( "{0000010d-0000-0000-C000-000000000046}" ); [ComImport, Guid( "0000010d-0000-0000-C000-000000000046" ), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IViewObject { [PreserveSig] 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); [PreserveSig] int GetColorSet([In, MarshalAs(UnmanagedType.U4)] int dwDrawAspect, int lindex, IntPtr pvAspect, [In] NativeMethods.tagDVTARGETDEVICE ptd, IntPtr hicTargetDev, [Out] NativeMethods.tagLOGPALETTE ppColorSet); [PreserveSig] int Freeze([In, MarshalAs(UnmanagedType.U4)] int dwDrawAspect, int lindex, IntPtr pvAspect, [Out] IntPtr pdwFreeze); [PreserveSig] int Unfreeze([In, MarshalAs(UnmanagedType.U4)] int dwFreeze); void SetAdvise([In, MarshalAs(UnmanagedType.U4)] int aspects, [In, MarshalAs(UnmanagedType.U4)] int advf, [In, MarshalAs(UnmanagedType.Interface)] System.Runtime.InteropServices.ComTypes.IAdviseSink pAdvSink); 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); } } } } } |
winfrom后台处理方面代码如下
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
|
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Drawing.Imaging; namespace Excel文件处理 { public partial class Html : Form { public Html() { InitializeComponent(); } private string ImageUrl = "" ; //图片地址 private string ImageName = "" ; //图片名称 private void button1_Click( object sender, EventArgs e) { string HtmlUrl = this .Txt_Url.Text.Trim(); if (HtmlUrl== "" ) { MessageBox.Show( "请输入网址" ); return ; } if (ImageUrl.Trim()== "" ) { ImageUrl = @"C:\Users\Administrator\Desktop" ; } try { Uri ri = new Uri( this .Txt_Url.Text); Bitmap bit = Print.Test.GetHtmlImage(ri, 1200); ImageName = this .Txt_Name.Text.Trim(); //图片名称 if (ImageName != "" ) { if (ImageName.IndexOf( '.' ) != -1) { //当用户输入图片后缀时,将后缀截取 ImageName.Substring(0, ImageName.LastIndexOf( '.' )); } } else ImageName = DateTime.Now.Ticks.ToString(); //时间名称 switch ( this .comboBox1.SelectedText) { case "GIF" : ImageUrl += "\\" + ImageName + ".gif" ; break ; case "JPG" : ImageUrl += "\\" + ImageName + ".jpg" ; break ; case "PNG" : ImageUrl += "\\" + ImageName + ".png" ; break ; default : ImageUrl += "\\" + ImageName + ".png" ; break ; } switch ( this .comboBox1.SelectedText) { case "GIF" : bit.Save(ImageUrl, ImageFormat.Gif); break ; case "JPG" : bit.Save(ImageUrl, ImageFormat.Jpeg); break ; case "PNG" : bit.Save(ImageUrl, ImageFormat.Png); break ; default : bit.Save(ImageUrl, ImageFormat.Png); break ; } bit = null ; ImageUrl = "" ; //图片地址 ImageName = "" ; //图片名称 MessageBox.Show( "生产成功" ); } catch { MessageBox.Show( "网址输入有误!" ); return ; } } private void button2_Click( object sender, EventArgs e) { //获取保存路径 if ( this .folderBrowserDialog1.ShowDialog()==DialogResult.OK) { if ( this .folderBrowserDialog1.SelectedPath.Trim()!= "" ) { ImageUrl = folderBrowserDialog1.SelectedPath; this .label6.Text = ImageUrl; } } } } } |
希望本文所述对大家的C#程序设计有所帮助。
栏目列表
最新更新
python爬虫及其可视化
使用python爬取豆瓣电影短评评论内容
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
uniapp/H5 获取手机桌面壁纸 (静态壁纸)
[前端] DNS解析与优化
为什么在js中需要添加addEventListener()?
JS模块化系统
js通过Object.defineProperty() 定义和控制对象
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比