1. 程式人生 > >Winform實現將網頁生成圖片的方法

Winform實現將網頁生成圖片的方法

agen linq hal url label info reserve omr thumbnail

通常瀏覽器都有將網頁生成圖片的功能,本文實例講述了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#程序設計有所幫助。

除聲明外,跑步客文章均為原創,轉載請以鏈接形式標明本文地址
Winform實現將網頁生成圖片的方法

本文地址: http://www.paobuke.com/develop/c-develop/pbk23469.html






相關內容

技術分享圖片詳解c# 類的構造方法技術分享圖片C# 重寫ComboBox實現下拉任意組件的方法技術分享圖片C#實現在網頁中根據url截圖並輸出到網頁的方法技術分享圖片C#異步委托調用實例分析
技術分享圖片C#刪除最後一個結尾逗號的方法技術分享圖片C#導出GridView數據到Excel文件類實例技術分享圖片Winform基於多線程實現每隔1分鐘執行一段代碼技術分享圖片用C#的params關鍵字實現方法形參個數可變示例

Winform實現將網頁生成圖片的方法