对指定的网页进行截图(C#版)

2010-08-28 10:52:01来源:西部e网作者:

碰到一个项目,需要对指定的网页进行截图保存,晕死!

需求永远都是怪异的.....
解决是关键~

遂写了以下代码,快准狠!(因为赶时间!)
可以实现对指定的页面获取,按指定的大小生成缩略图,当然也可以1:1的产生图,
页面上的javascript 运行对截图貌似没任何影响,相当的正常,我个人都觉得很神奇。

首先对项目添加系统引用
System.Drawing;
System.Drawing.Design;
System.Windows.Forms;

获取指定网页并转换成图片的类:

using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Windows.Forms;
using System.Diagnostics;

namespace MyLib
{
    
public class GetImage
    
{
        
private int S_Height;
        
private int S_Width;
        
private int F_Height;
        
private int F_Width;
        
private string MyURL;

        
public int ScreenHeight
        
{
            
get return S_Height; }
            
set { S_Height = value; }
        }


        
public int ScreenWidth
        
{
            
get return S_Width; }
            
set { S_Width = value; }
        }


        
public int ImageHeight
        
{
            
get return F_Height; }
            
set { F_Height = value; }
        }


        
public int ImageWidth
        
{
            
get return F_Width; }
            
set { F_Width = value; }
        }


        
public string WebSite
        
{
            
get return MyURL; }
            
set { MyURL = value; }
        }


        
public GetImage(string WebSite, int ScreenWidth, int ScreenHeight, int ImageWidth, int ImageHeight)
        
{
            
this.WebSite = WebSite;
            
this.ScreenWidth = ScreenWidth;
            
this.ScreenHeight = ScreenHeight;
            
this.ImageHeight = ImageHeight;
            
this.ImageWidth = ImageWidth;
        }


        
public Bitmap GetBitmap()
        
{
            WebPageBitmap Shot 
= new WebPageBitmap(this.WebSite, this.ScreenWidth, this.ScreenHeight);
            Shot.GetIt();
            Bitmap Pic 
= Shot.DrawBitmap(this.ImageHeight, this.ImageWidth);
            
return Pic;
        }

    }


    
class WebPageBitmap
    
{
        WebBrowser MyBrowser;
        
string URL;
        
int Height;
        
int Width;

        
public WebPageBitmap(string url, int width, int height)
        
{
            
this.Height = height;
            
this.Width = width;
            
this.URL = url;
            MyBrowser 
= new WebBrowser();
            MyBrowser.ScrollBarsEnabled 
= false;
            MyBrowser.Size 
= new Size(this.Width, this.Height);
        }


        
public void GetIt()
        
{
            MyBrowser.Navigate(
this.URL);
            
while (MyBrowser.ReadyState != WebBrowserReadyState.Complete)
            
{
                Application.DoEvents();
            }

        }


        
public Bitmap DrawBitmap(int theight, int twidth)
        
{
            Bitmap myBitmap 
= new Bitmap(Width, Height);
            Rectangle DrawRect 
= new Rectangle(00, Width, Height);
            MyBrowser.DrawToBitmap(myBitmap, DrawRect);
            System.Drawing.Image imgOutput 
= myBitmap;
            System.Drawing.Image oThumbNail 
= new Bitmap(twidth, theight, imgOutput.PixelFormat);
            Graphics g 
= Graphics.FromImage(oThumbNail);
            g.CompositingQuality 
= CompositingQuality.HighSpeed;
            g.SmoothingMode 
= SmoothingMode.HighSpeed;
            g.InterpolationMode 
= InterpolationMode.HighQualityBilinear;
            Rectangle oRectangle 
= new Rectangle(00, twidth, theight);
            g.DrawImage(imgOutput, oRectangle);
            
try
            
{

                
return (Bitmap)oThumbNail;
            }

            
catch (Exception ex)
            
{
                
return null;
            }

            
finally
            
{
                imgOutput.Dispose();
                imgOutput 
= null;
                MyBrowser.Dispose();
                MyBrowser 
= null;
            }

        }

    }


}



以下是调用方法,懒省事的方法,嘿嘿,赶时间就不说什么了,反正上面的抓取转换类已经写出来了,大家尽情的用异步,线程等方法自己玩吧!~

\
    
string UrlPath;
    
bool CaptureState = false;
    Guid guid;
    
protected bool SaveOriginalPageToImage(Guid myGuid)
    
{
//使用guid 来命名
        guid = myGuid;
        
if (this.CurrentPageAct == PageAct.Edit)
        
{
            
string PagePath = Request.Url.LocalPath;
            PagePath 
= PagePath.Replace("Operation""Capture");

            UrlPath 
= PagePath + "?act=view&ProjectNo=" + _projectNo;

            Thread NewTh 
= new Thread(CaptureImage);
            NewTh.SetApartmentState(ApartmentState.STA);
            NewTh.Start();
            
while (NewTh.ThreadState == ThreadState.Running)
            
{
            }

            
//返回截取状态
            return CaptureState;
        }

        
return false;
    }


      
/// <summary>
    
/// 捕获屏幕
    
/// </summary>
    
/// <param name="UrlPath"></param>
    
/// <returns></returns>

    public void CaptureImage()
    
{
        
try
        
{
            
string url = "http://" + Request.Url.Host + ":" + Request.Url.Port.ToString();
            url 
= url + UrlPath;

            GetImage thumb 
= new GetImage(url, 1024120010241200);
            System.Drawing.Bitmap x 
= thumb.GetBitmap();
            
string FileName = DateTime.Now.ToString("yyyyMMddhhmmss");

            x.Save(Server.MapPath(
"~/Capture/SavePage"+ "\\" + guid + ".jpg");
            CaptureState 
= true;
        }

        
catch (Exception ex)
        
{
            CaptureState 
= false;
        }

    }
关键词:C#

赞助商链接: