`
qzriso
  • 浏览: 235706 次
  • 性别: Icon_minigender_1
  • 来自: ph
社区版块
存档分类
最新评论

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

    博客分类:
  • 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;  
        }  
    }  

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics