旧帖子顶不起来了,一共三贴,三百分结贴。
这是一个简化后的网页快照程序。有些网站打开很慢,如果在10秒后程序仍未运行完毕就停止截图并释放相关资源,同时在页面出现“快照截图超时”的错误提示。该怎么写代码?
“m_WebBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(WebBrowser_DocumentCompleted);”试着在这里增加一个条件语句也不成功。
我是菜鸟,已经贴出所有代码,所以不必给我思路,直接求完整可用的代码!先谢谢了:
Default.aspx<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Button ID="Button1" runat="server" Text="保存网页快照" onclick="Button1_Click" />
    </div>
    </form>
</body>
</html>
Default.aspx.csusing System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Drawing;
using System.IO;
 
 
public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
 
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        Bitmap bmp = HtmlToImg.GetHtmlToImg("http://www.baidu.com/", 800, 600, 800, 600);
        MemoryStream stream = new MemoryStream();
        bmp.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
        byte[] buff = stream.ToArray();
 
        FileStream fs = new FileStream(Server.MapPath(DateTime.Now.ToString("yyyyMMddHHmmss") + ".jpg"), FileMode.Create);
        stream.WriteTo(fs);
        stream.Close();
        fs.Close();
    }
}
HtmlToImage.csusing System;
using System.Drawing;
using System.Threading;
using System.Windows.Forms;
 
public class HtmlToImg
{
    Bitmap m_Bitmap;
    string m_Url;
    int m_BrowserWidth, m_BrowserHeight, m_ThumbnailWidth, m_ThumbnailHeight;
 
    public HtmlToImg(string Url, int BrowserWidth, int BrowserHeight, int ThumbnailWidth, int ThumbnailHeight)
    {
        m_Url = Url;
        m_BrowserHeight = BrowserHeight;
        m_BrowserWidth = BrowserWidth;
        m_ThumbnailWidth = ThumbnailWidth;
        m_ThumbnailHeight = ThumbnailHeight;
    }
 
    public static Bitmap GetHtmlToImg(string Url, int BrowserWidth, int BrowserHeight, int ThumbnailWidth, int ThumbnailHeight)
    {
        HtmlToImg thumbnailGenerator = new HtmlToImg(Url, BrowserWidth, BrowserHeight, ThumbnailWidth, ThumbnailHeight);
        return thumbnailGenerator.GenerateHtmlToImgImage();
    }
 
    public Bitmap GenerateHtmlToImgImage()
    {
        Thread m_thread = new Thread(new ThreadStart(_GenerateHtmlToImgImage));
        m_thread.SetApartmentState(ApartmentState.STA);
        m_thread.Start();
        m_thread.Join();
        return m_Bitmap;
    }
 
    private void _GenerateHtmlToImgImage()
    {
        WebBrowser m_WebBrowser = new WebBrowser();
        m_WebBrowser.ScrollBarsEnabled = false;
        m_WebBrowser.Navigate(m_Url);
        m_WebBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(WebBrowser_DocumentCompleted);
        while (m_WebBrowser.ReadyState != WebBrowserReadyState.Complete)
            Application.DoEvents();
        m_WebBrowser.Dispose();
    }
 
    private void WebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        WebBrowser m_WebBrowser = (WebBrowser)sender;
        m_WebBrowser.ClientSize = new Size(this.m_BrowserWidth, this.m_BrowserHeight);
        m_WebBrowser.ScrollBarsEnabled = false;
        m_Bitmap = new Bitmap(m_WebBrowser.Bounds.Width, m_WebBrowser.Bounds.Height);
        m_WebBrowser.BringToFront();
        m_WebBrowser.DrawToBitmap(m_Bitmap, m_WebBrowser.Bounds);
        m_Bitmap = (Bitmap)m_Bitmap.GetThumbnailImage(m_ThumbnailWidth, m_ThumbnailHeight, null, IntPtr.Zero);
    }
 
}

解决方案 »

  1.   

    修改了你的这个方法 _GenerateHtmlToImgImage,不过这时候返回的图片为空。楼主要自己处理一下WebBrowser m_WebBrowser = null;
        private void _GenerateHtmlToImgImage()
        {
            m_WebBrowser = new WebBrowser();
            System.Windows.Forms.Timer t = new System.Windows.Forms.Timer();
            t.Enabled = false;
            t.Interval = 10000;
            t.Tick += t_Tick;        m_WebBrowser.ScrollBarsEnabled = false;
            t.Enabled = true;
            m_WebBrowser.Navigate(m_Url);
            m_WebBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(WebBrowser_DocumentCompleted);
            
            while (m_WebBrowser != null && m_WebBrowser.ReadyState != WebBrowserReadyState.Complete)
                Application.DoEvents();
            if (m_WebBrowser != null)
                m_WebBrowser.Dispose();        
            m_WebBrowser = null;
        }    void t_Tick(object sender, EventArgs e)
        {
            ((System.Windows.Forms.Timer)sender).Stop();        WebBrowser tmp = m_WebBrowser;
            if (tmp != null)
            {
                m_WebBrowser = null;
                if (tmp.ReadyState != WebBrowserReadyState.Complete)
                {
                    tmp.Stop();
                    tmp.Dispose();                
                }
            }        
        }
      

  2.   

    谢谢!
    我这里测试10000毫秒正常,但测试10毫秒以内生成图片的限制出错了:
    未将对象引用设置到对象的实例。bmp.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
    我看不大懂,是不是超时后没有终止程序释放资源啊?
      

  3.   


    if(bmp != null)
    {
    MemoryStream stream = new MemoryStream();
            bmp.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
            byte[] buff = stream.ToArray();
      
            FileStream fs = new FileStream(Server.MapPath(DateTime.Now.ToString("yyyyMMddHHmmss") + ".jpg"), FileMode.Create);
            stream.WriteTo(fs);
            stream.Close();
            fs.Close();
    }
      

  4.   

    非常感谢,好像可以了!!!
    但是我想在这里if(bmp != null)增加超时的提示(比如,超时没有抓到图的时候就把“超时了”写到Default.aspx这个页面里)试了几次都不行。我很菜,麻烦你再帮我加上这个判断和提示好吗?
    拜托!
      

  5.   

    对了,不一定在if(bmp != null)这里增加超时的提示,是我乱写的。不管写在哪里,只要判断了、提示了就行!谢谢!
      

  6.   

    问题一开始就是这样的:“如果在10秒后程序仍未运行完毕就停止截图并释放相关资源,同时在页面出现“快照截图超时”的错误提示。”增加一个提示应该不是大问题吧?拜托高手再增加一个else判断一下吧,我不大会写程序,是不是在.aspx.cs里面做不到啊?
      

  7.   

    请问可以增加一个else判断吗?如果实在不好办,我这个思路是否可行:超出十秒就定义一个变量(全局变量?)然后在.aspx里面加条件语句执行。这样行吗?