對(duì)指定的網(wǎng)頁進(jìn)行截圖(C#版)

2010-08-28 10:52:01來源:西部e網(wǎng)作者:

碰到一個(gè)項(xiàng)目,需要對(duì)指定的網(wǎng)頁進(jìn)行截圖保存,暈死!

需求永遠(yuǎn)都是怪異的.....
解決是關(guān)鍵~

遂寫了以下代碼,快準(zhǔn)狠!(因?yàn)橼s時(shí)間。
可以實(shí)現(xiàn)對(duì)指定的頁面獲取,按指定的大小生成縮略圖,當(dāng)然也可以1:1的產(chǎn)生圖,
頁面上的javascript 運(yùn)行對(duì)截圖貌似沒任何影響,相當(dāng)?shù)恼,我個(gè)人都覺得很神奇。

首先對(duì)項(xiàng)目添加系統(tǒng)引用
System.Drawing;
System.Drawing.Design;
System.Windows.Forms;

獲取指定網(wǎng)頁并轉(zhuǎn)換成圖片的類:

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;
            }

        }

    }


}



以下是調(diào)用方法,懶省事的方法,嘿嘿,趕時(shí)間就不說什么了,反正上面的抓取轉(zhuǎn)換類已經(jīng)寫出來了,大家盡情的用異步,線程等方法自己玩吧!~

\
    
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)
            
{
            }

            
//返回截取狀態(tài)
            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;
        }

    }
關(guān)鍵詞:C#

贊助商鏈接: