软件编程
位置:首页>> 软件编程>> C#编程>> Winform实现将网页生成图片的方法

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

作者:shichen2014  发布时间:2022-09-06 13:39:31 

标签:Winform,网页,生成,图片

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

工具截图如下:

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

生成后的图片如下:

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

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com