zoukankan      html  css  js  c++  java
  • 对指定的网页进行截图 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(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;
            }

        }
  • 相关阅读:
    自己实现的string的库函数
    单链表的面试题
    顺序表的实现
    指针数组与数组指针
    指针与数组
    sizeof 与 strlen
    HTML配色工具!在线配色工具
    [转载] python的sorted函数对字典按key排序和按value排序
    [转载]python脚本删除一定时间以外的文件
    python基础教程(四)
  • 原文地址:https://www.cnblogs.com/SUNBOY/p/866779.html
Copyright © 2011-2022 走看看