C#整个网页保存成图片

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

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;

namespacePRint {

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.GetIUnknownForObjec t(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.IAdviseSin k 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.IAdviseSin k[] pAdvSink);

}

}

}

}

}

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航