首页 > 代码库 > 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 }
View Code

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将网页生成图片