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 Print12 {13 public class Test14 {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 WebControlImage35 {36 internal static class NativeMethods37 {38 [StructLayout(LayoutKind.Sequential)]39 public sealed class tagDVTARGETDEVICE40 {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 COMRECT54 {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 tagLOGPALETTE87 {88 [MarshalAs(UnmanagedType.U2)]89 public short palVersion;90 [MarshalAs(UnmanagedType.U2)]91 public short palNumEntries;92 }93 }94 public class Snapshot95 {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:\Users\Administrator\Desktop"; 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 } https://www.cnblogs.com/xiao-bei/p/3968660.html總結
以上是生活随笔為你收集整理的Winform将网页生成图片的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c#调用刀片小票打印机
- 下一篇: 巅峰坦克启动时出现这怎么解决?