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

        }
  • 相关阅读:
    Aurora 数据库支持多达五个跨区域只读副本
    Amazon RDS 的 Oracle 只读副本
    Amazon EC2 密钥对
    DynamoDB 读取请求单位和写入请求单位
    使用 EBS 优化的实例或 10 Gb 网络实例
    启动 LAMP 堆栈 Web 应用程序
    AWS 中的错误重试和指数退避 Error Retries and Exponential Backoff in AWS
    使用 Amazon S3 阻止公有访问
    路由表 Router Table
    使用MySQLAdmin工具查看QPS
  • 原文地址:https://www.cnblogs.com/SUNBOY/p/866779.html
Copyright © 2011-2022 走看看