LINUX DOTNET      Linux DotNET 中文社区

Linux .NET编程与应用技术之专业网站:www.linuxdot.net !     返回首页    
   
[楼主] [转] C#对指定的网页进行截图

碰到一个项目,需要对指定的网页进行截图保存,晕死! 
需求永远都是怪异的..... 
解决是关键~ 
遂写了以下代码,快准狠!(因为赶时间!) 
可以实现对指定的页面获取,按指定的大小生成缩略图,当然也可以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(0, 0, 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(0, 0, 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, 1024, 1200, 1024, 1200);  
            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;  
        }  
    }  

作者:linuxboy   发布时间:08年04月20日   可选操作:删除 回复

[1楼] 回复:[转] C#对指定的网页进行截图

顶一下

作者:Charlesjun   发布时间:08年05月08日   可选操作:删除 回复

 
   
   

留言回复:
标题: * 标题必填
作者:   * 请填上你的名字  
操作键:   * 填入几个字母表示是您写的,便于进一步操作
发言内容:
 
发贴者须知:
1、您无需注册即可发贴,但是,贴子内容必须在法律法规和社会公德所允许的范围内;
2、本站专注IT技术,谢绝包括政治、社会、情感等任何与IT技术无关的贴子在本站发表;
3、本站保留对任何贴子进行删除、禁用、更改、举报、追究等所有权利;
 
今天是: 星期天  星期一  星期二  星期三  星期四  星期六  星期五