栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C# > C#教程

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

C#教程 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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:UsersAdministratorDesktop";  
      }
      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#程序设计有所帮助。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/126069.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号