VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > c#编程 >
  • C#教程之Winform实现将网页生成图片的方法

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

工具截图如下:

生成后的图片如下:

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

具体代码如下:

将html生成图片的类

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
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后台处理方面代码如下

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
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#程序设计有所帮助。


相关教程