首页 > 代码库 > Winform将网页生成图片
Winform将网页生成图片
今天无意见看到浏览器有将网页生成图片的功能,顿时赶脚很好奇,于是就找了找资料自己做了一个类似的功能。
工具截图:生成后的图片
手动填写网站地址,可选择图片类型和保持图片地址,来生成页面的图片,当图片路径未选择时则保存桌面;
具体代码如下:
将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 try119 {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 UnsafeNativeMethods145 {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 IViewObject149 {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 : Form14 {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:\Users\Administrator\Desktop"; 32 }33 try34 {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 else46 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 catch69 {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 }
Winform将网页生成图片
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。