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

工具截图:

生成后的图片

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

具体代码如下:

将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将网页生成图片相关推荐

  1. C#Winform调用网页中的JS方法

    其实还是还是相当的简单,本文将详细的用代码来展示一下如何调用,并且送上源代码. 这个主题,其实我是在QQ问问里看到的,那为Q友送上了380分,所以就写做了这样的一个DEMO.同时这里也分享给更多正在寻 ...

  2. php中网页生成图片的方式,类似长微博图片生成器

    导读:因媒体站微博传播需要,需在转发文章至新浪微博时能将文章正文已图片形式传播出去,用以提高微博内容转发积极性,顾需要在原有php项目代码中加入网页转图片功能. 在java中网页转图片有已经开源的转换 ...

  3. htmlcanvas2实现将网页生成图片,自定义保存图片的名称

    首先熟悉htmlcanvas2的使用方法,看看github的使用说明 https://github.com/niklasvh/html2canvas html2canvas(document.body ...

  4. Chrome浏览器截取网页生成图片

    通过Chrome浏览器截取整个网页的方法有很多,例如: 1. F12或者Ctrl+Shift+I打开开发者工具,再在任意Tab上按Ctrl+Shift+P,再在弹出的输入框中输入full size s ...

  5. 使用html2canvas.min.js将网页生成图片并打印(笔记记录)

    <iframe id="downloadFrame" style="display:none;"></iframe> //打印 func ...

  6. winform下载网页源码

    public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_C ...

  7. 将整个html网页生成图片

    1 <!--* @Description: * @Author: 熊成强* @Date: 2019-06-25 14:21:15* @LastEditTime: 2019-09-27 16:39 ...

  8. C# winform post请求数据

    刚到公司混的时候,老板要求实现一个从C#的windows应用程序传参数到一个网页,然后这个网页不显示出来,但能把数据返回给应用程序的功能,问了好多人,找了好多资料,都搞不定,后来还是在老板的帮助下搞定 ...

  9. htmlCanvas2生成图片,并把图片保存到后台

    最近做了一个把网页生成图片,并保存到的功能,知道了还有base64这个东西,写个博客来记录. 先做好网页代码, 初始化页面就把图片生成后并传到后台: //useCORS:true, logging:t ...

最新文章

  1. oracle 事务故障,处理Oracle的分布式事务故障
  2. 异常值处理 - iterrows()对 DataFrame 进行遍历,并修改遍历中的异常值 - Python代码
  3. 没有Science也没有娃,上海交大博士谈科研经历爆笑全场
  4. jQuery 学习-样式篇(二):jQuery 对象与原生 DOM 对象
  5. Linux第二周考试题
  6. Hyperledger Fabric 或 Composer 获取指定Tx_id(transactionId)的信息
  7. slickedit使用
  8. vmware安装了vmware tools还是无法复制文件与文本(ubuntu16.04)
  9. Android 之大话-设计模式
  10. FME实现CAD文件复杂注记
  11. 易语言编写登录小程序
  12. 利用python,求解数独
  13. 知识图谱嵌入的Translate模型汇总(TransE,TransH,TransR,TransD)
  14. 解决“javac不是内部或外部命令,也不是可运行的程序”问题
  15. 华为S5700三层交换机不同VLAN互通
  16. python开发mbus程序_Mbus 2019(水表校验程序)V2.1 最新版
  17. 广州招聘会12月一览表.
  18. 做硬件好还是软件好,千万别选错了路!
  19. sap开发语言_我应该怎么学习SAP?
  20. 基于用户行为分析的推荐算法

热门文章

  1. QDoc创建帮助项目文件
  2. C语言内存编址和寻址、内存对齐
  3. c++如何定义一个只能在堆上(栈上)生成对象的类?
  4. 众唱点歌机会显示无法连接服务器,目前众多厂商唱多的服务器附加存储缺点分析...
  5. 怎么把线稿提取出来_ps提取线稿教程(ps怎么把图片的线稿弄出来)
  6. 去掉字符串中的单引号和双引号_同时搞定Android和iOS的Dart语言(4):字符串类型...
  7. chmod 777命令_linux常用命令
  8. tensorflow中tf.get_variable()函数详解
  9. 使用EasyUI Tree异步加载JSON数据 生成树
  10. 通过exp命令对Oracle数据库进行备份操作(提供两种情况的备份:备份本地,备份远程的数据库)