HTML to Image in C#(C#实现Html转换为Image,即网页截图)
来源:互联网 发布:安装mysql步骤 编辑:程序博客网 时间:2024/04/30 08:25
原文链接地址:
http://www.codeproject.com/Articles/58605/HTML-to-Image-in-C
Introduction
In this article, I will show you how to capture an HTML document as an image using a WebBrowser
object and the IViewObject.Draw
method, which according to MSDN draws a representation of an object onto the specified device context. Before we get started, I just want to mention that the obtained results were identical to those obtained using commercial libraries, so I hope this will be useful to someone.
在这篇文章里,我将会演示如何捕获HTML文档并保存为图片,使用WebBrowser对象和IViewObject.Draw
方法。
根据MSDN的描述,IViewObject.Draw
用户将对象的表现画到制定的设备上下文中。
在我们开始之前,。。。
The IViewObject interface
The very first thing that we must do is to define the IViewObject
interface.
我们必须做的首要事情是,我们需要定义IViewObject接口。
ComVisible(true), ComImport()][GuidAttribute("0000010d-0000-0000-C000-000000000046")][InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]public interface IViewObject{ [return: MarshalAs(UnmanagedType.I4)] [PreserveSig] int Draw( [MarshalAs(UnmanagedType.U4)] UInt32 dwDrawAspect, int lindex, IntPtr pvAspect, [In] IntPtr ptd, IntPtr hdcTargetDev, IntPtr hdcDraw, [MarshalAs(UnmanagedType.Struct)] ref Rectangle lprcBounds, [MarshalAs(UnmanagedType.Struct)] ref Rectangle lprcWBounds, IntPtr pfnContinue, [MarshalAs(UnmanagedType.U4)] UInt32 dwContinue); [PreserveSig] int GetColorSet([In, MarshalAs(UnmanagedType.U4)] int dwDrawAspect, int lindex, IntPtr pvAspect,[In] IntPtr ptd, IntPtr hicTargetDev, [Out] IntPtr 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)] IAdviseSink pAdvSink); void GetAdvise([In, Out, MarshalAs(UnmanagedType.LPArray)] int[] paspects, [In, Out, MarshalAs(UnmanagedType.LPArray)] int[] advf, [In, Out, MarshalAs(UnmanagedType.LPArray)] IAdviseSink[] pAdvSink);}
Below is a summary description of the parameters that the Draw
method takes (this is the only method we will use):
UInt32 dwDrawAspect
- specifies the aspect to be drawn. Valid values are taken from theDVASPECT
andDVASPECT2
enumerations. In this example, I'm usingDVASPECT.CONTENT
so the value passed is 1.int lindex
- portion of the object that is of interest for the draw operation. Currently, only -1 is supported.IntPtr pvAspect
- pointer to the additional information.IntPtr ptd
- describes the device for which the object is to be rendered. We will render for the default target device, so the value passed will beIntPtr.Zero
.IntPtr hdcTargetDev
- information context for the target device indicated by theptd
parameter.IntPtr hdcDraw
- device context on which to draw.ref Rectangle lprcBounds
- the size of the capturedimage.ref Rectangle lprcWBounds
- the region of theWebBrowser
object that we want to be captured.IntPtr pfnContinue
- pointer to a callback function (not used here).UInt32 dwContinue
- value to pass as a parameter to the function (not used here).
The HtmlCapture class
Now that we have defined our IViewObject
interface, it is time to move on and create a class that will be used to capture a web page as animage.
public class HtmlCapture{ private WebBrowser web; private Timer tready; private Rectangle screen; private Size? imgsize=null; //an event that triggers when the html document is captured public delegate void HtmlCaptureEvent(object sender, Uri url, Bitmap image); public event HtmlCaptureEvent HtmlImageCapture; //class constructor public HtmlCapture() { //initialise the webbrowser and the timer web = new WebBrowser(); tready = new Timer(); tready.Interval = 2000; screen = Screen.PrimaryScreen.Bounds; //set the webbrowser width and hight web.Width = screen.Width; web.Height = screen.Height; //suppress script errors and hide scroll bars web.ScriptErrorsSuppressed = true; web.ScrollBarsEnabled = false; //attached events web.Navigating += new WebBrowserNavigatingEventHandler(web_Navigating); web.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(web_DocumentCompleted); tready.Tick += new EventHandler(tready_Tick); } #region Public methods public void Create(string url) { imgsize = null; web.Navigate(url); } public void Create(string url,Size imgsz) { this.imgsize = imgsz; web.Navigate(url); } #endregion #region Events void web_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { //start the timer tready.Start(); } void web_Navigating(object sender, WebBrowserNavigatingEventArgs e) { //stop the timer tready.Stop(); } void tready_Tick(object sender, EventArgs e) { //stop the timer tready.Stop(); //capture html as an image //... } #endregion}
As you can see, I'm using a Timer
object to determine if theHTML document is fully loaded and can be captured. The reason I'm doing this is because anHTML document can trigger theDocumentCompleted
event multiple times. After the document is fully loaded, thetready_Tick
method is called.
void tready_Tick(object sender, EventArgs e){ //stop the timer tready.Stop(); //get the size of the document's body Rectangle body = web.Document.Body.ScrollRectangle; //check if the document width/height is greater than screen width/height Rectangle docRectangle = new Rectangle() { Location=new Point(0,0), Size=new Size(body.Width > screen.Width ? body.Width : screen.Width, body.Height > screen.Height ? body.Height : screen.Height) }; //set the width and height of the WebBrowser object web.Width = docRectangle.Width; web.Height = docRectangle.Height; //if the imgsize is null, the size of the image will //be the same as the size of webbrowser object //otherwise set the image size to imgsize Rectangle imgRectangle; if (imgsize == null) imgRectangle = docRectangle; else imgRectangle = new Rectangle() { Location=new Point(0,0), Size =imgsize.Value }; //create a bitmap object Bitmap bitmap = new Bitmap(imgRectangle.Width,imgRectangle.Height); //get the viewobject of the WebBrowser IViewObject ivo = web.Document.DomDocument as IViewObject; using (Graphics g = Graphics.FromImage(bitmap)) { //get the handle to the device context and draw IntPtr hdc = g.GetHdc(); ivo.Draw(1, -1, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, hdc, ref imgRectangle, ref docRectangle, IntPtr.Zero, 0); g.ReleaseHdc(hdc); } //invoke the HtmlImageCapture event HtmlImageCapture(this, web.Url, bitmap);}
Using the code
HtmlCapture
has an overloaded method namedCreate
. If you use theCreate(string url)
method, the size of theimage will be the same as the size of theHTML document. If you want to create a thumbnailimage of the HTML document, use Create(string url,Size imgsz)
.
private void button2_Click(object sender, EventArgs e){ HtmlCapture hc = new HtmlCapture(); hc.HtmlImageCapture += new HtmlCapture.HtmlCaptureEvent(hc_HtmlImageCapture); hc.Create("http://www.codeproject.com"); //or hc.Create("http://www.codeproject.com",new Size(200,300)); }void hc_HtmlImageCapture(object sender, Uri url, Bitmap image){ image.Save("C:/"+ url.Authority+ ".bmp");}
- HTML to Image in C#(C#实现Html转换为Image,即网页截图)
- HTML to Image in C#指定网页地址,获取内容为图片
- HTML to Image Converter
- Use image from html to chm in Html help workshop
- How To Convert HTML Page To Image
- 网页内联图片 html inline image
- C# 转换函数 (Stream to Byte[],Byte to Image,Image to Byte[],Image缩放,Byte[] to Bitmap)
- img2html:Convert a image to HTML
- Java 实现HTML 页面转成image 图片
- html image study note
- html Image Placeholder
- HTML--Note4--image
- html image图片标签
- 把Html插入canvas实现网页截图
- HTML 网页截图
- html转换为图片(html to jpg)
- *Bitmap 转换为 *Image
- view转换为image
- sqlserver事务与oracle事务
- 【命令提取】工具
- 30 岁? 25思考.......
- Perl Verify PMCoreBasedAD
- .net的组件
- HTML to Image in C#(C#实现Html转换为Image,即网页截图)
- 通过使用resetlog恢复控制文件恢复数据库
- 查询Oracle使用的特性
- Perl I/O Read & Write
- android 电话状态的监听(来电和去电)
- 简介Spring中常用的hql查询方法
- 注册JDBC驱动的三种方式
- 最简单的菜单导航--不兼容IE6
- 虚拟文件路径,轻松搞定某些软件对特殊文件路径不能识别问题