zoukankan      html  css  js  c++  java
  • 将网页转换成图片

    原文发布时间为:2010-08-08 —— 来源于本人的百度文章 [由搬家工具导入]

    调用

    Bitmap MyImage = HtmlToImage.GetHtmlImage(new Uri("http://www.baidu.com"), 1024);
    MyImage.Save("baidu.jpg");
    MyImage.Dispose();


    ====== 将网页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 HtmlToImage
    {
    public class HtmlToImage
    {
    /// <summary>
    /// 将HTML转成图片
    /// </summary>
    /// <param name="UrlString">HTML地址</param>
    /// <param name="Width">宽度</param>
    /// <returns>Bitmap图片</returns>
    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;

    }
    /// <summary>
    /// WebBrowser获取图形
    /// </summary>
    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
    {
    /// <summary>
    /// 取快照
    /// </summary>
    /// <param name="pUnknown">Com 对象</param>
    /// <param name="bmpRect">图象大小</param>
    /// <returns></returns>
    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);
    }
    }
    }
    }
    }
  • 相关阅读:
    20165328《信息安全系统设计基础》实验二固件程序设计实验报告
    20165328《信息安全系统设计基础》第六周学习总结
    2018-2019-1 20165305 20165319 20165328 实验一 开发环境的熟悉
    2018-2019-1 20165328《信息安全系统设计基础》第四周学习总结
    2018-2019-1 20165328 《信息安全系统设计基础》第三周学习总结及实验报告
    20165328《信息安全系统设计基础》第一周总结
    20165358课程总结
    20165328 实验五《网络安全编程》实验报告
    20165218 2018-2019-1 《信息安全系统》第八章学习总结
    2018-2019-1 20165218 实验三 实时系统
  • 原文地址:https://www.cnblogs.com/handboy/p/7163989.html
Copyright © 2011-2022 走看看