大学IT网 - 最懂大学生的IT学习网站! QQ资料交流群:367606806
当前位置:大学IT网 > ASP.NET技巧 > Winform将网页生成图片

Winform将网页生成图片(1)

关键词:Winform网页生成图片  阅读(1176) 赞(13)

[摘要]本文是对Winform将网页生成图片的讲解,对学习ASP.NET编程技术有所帮助,与大家分享。

今天无意见看到浏览器有将网页生成图片的功能,顿时赶脚很好奇,于是就找了找资料自己做了一个类似的功能。

工具截图:生成后的图片

手动填写网站地址,可选择图片类型和保持图片地址,来生成页面的图片,当图片路径未选择时则保存桌面;

具体代码如下:

将html生成图片的类

 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);
                 }
             }
         }
     }
 }
«上一页12下一页»


相关评论