zoukankan      html  css  js  c++  java
  • 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                     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 }
    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 : 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:UsersAdministratorDesktop";   
    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 }
  • 相关阅读:
    Node Sass version 5.0.0 is incompatible with^4.0.0
    Vue v-html 的使用
    SQL 判断时间是否为空
    Element UI 表单验证
    Mybatis-Plus根据条件更新
    语法检查工具 http://jshint.com/
    安装node_modules文件遇到的问题:更改代理
    知识点3: 学习中遇到的问题
    Vue: 用 key 管理可复用的元素
    Vue遇到的问题
  • 原文地址:https://www.cnblogs.com/xiao-bei/p/3968660.html
Copyright © 2011-2022 走看看