首页 > 编程 > C# > 正文

Winform实现将网页生成图片的方法

2020-01-24 02:23:29
字体:
来源:转载
供稿:网友

通常浏览器都有将网页生成图片的功能,本文实例讲述了Winform实现将网页生成图片的方法。分享给大家供大家参考。具体方法如下:

工具截图如下:

生成后的图片如下:

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

具体代码如下:

将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);        }      }    }  }}

winfrom后台处理方面代码如下

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#程序设计有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表