在asp.net中使用网络浏览器将html页面转换为图像需要花费太多时间来生成重html页面的图像

本文关键字:html 图像 太多 时间 转换 net asp 网络 浏览器 | 更新日期: 2023-09-27 18:27:59

当我使用网络浏览器将html页面转换为图像时,我遇到了一个问题——使用厚重的html页面需要花费太多时间。

它适用于小型HTML页面,但当HTML页面很重时,它就会卡在中

Application.DoEvent();功能

        WebBrowser m_WebBrowser = new WebBrowser();
            m_WebBrowser.ScriptErrorsSuppressed = true;
            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();

创建HTML页面后,我们将HTML页面的URL传递给GetWebSiteThumbnail()函数。代码:

public class WebsiteThumbnailImageGenerator
{
    public static Bitmap GetWebSiteThumbnail(string Url, int BrowserWidth, int BrowserHeight, int ThumbnailWidth, int ThumbnailHeight)
    {
        WebsiteThumbnailImage thumbnailGenerator = new WebsiteThumbnailImage(Url, BrowserWidth, BrowserHeight, ThumbnailWidth, ThumbnailHeight);
        return thumbnailGenerator.GenerateWebSiteThumbnailImage();
    }
    private class WebsiteThumbnailImage
    {
        public WebsiteThumbnailImage(string Url, int BrowserWidth, int BrowserHeight, int ThumbnailWidth, int ThumbnailHeight)
        {
            this.m_Url = Url;
            this.m_BrowserWidth = BrowserWidth;
            this.m_BrowserHeight = BrowserHeight;
            this.m_ThumbnailHeight = ThumbnailHeight;
            this.m_ThumbnailWidth = ThumbnailWidth;
        }
        private string m_Url = null;
        public string Url
        {
            get
            {
                return m_Url;
            }
            set
            {
                m_Url = value;
            }
        }
        private Bitmap m_Bitmap = null;
        public Bitmap ThumbnailImage
        {
            get
            {
                return m_Bitmap;
            }
        }
        private int m_ThumbnailWidth;
        public int ThumbnailWidth
        {
            get
            {
                return m_ThumbnailWidth;
            }
            set
            {
                m_ThumbnailWidth = value;
            }
        }
        private int m_ThumbnailHeight;
        public int ThumbnailHeight
        {
            get
            {
                return m_ThumbnailHeight;
            }
            set
            {
                m_ThumbnailHeight = value;
            }
        }
        private int m_BrowserWidth;
        public int BrowserWidth
        {
            get
            {
                return m_BrowserWidth;
            }
            set
            {
                m_BrowserWidth = value;
            }
        }
        private int m_BrowserHeight;
        public int BrowserHeight
        {
            get
            {
                return m_BrowserHeight;
            }
            set
            {
                m_BrowserHeight = value;
            }
        }
        public Bitmap GenerateWebSiteThumbnailImage()
        {
            Thread m_thread = new Thread(new ThreadStart(_GenerateWebSiteThumbnailImage));
            m_thread.SetApartmentState(ApartmentState.STA);
            m_thread.Start();
            m_thread.Join();
            return m_Bitmap;
        }
        private void _GenerateWebSiteThumbnailImage()
        {
            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);
        }
    }

在asp.net中使用网络浏览器将html页面转换为图像需要花费太多时间来生成重html页面的图像

我稍微更改了您的类,现在它使用async/await而不是忙于等待。

您可以将其用作

var th = new WebsiteThumbnailImage("http://www.google.com", 1024, 768, 256, 192);
this.BackgroundImage =  await th.GenerateWebSiteThumbnailImage();

class WebsiteThumbnailImage
{
    public WebsiteThumbnailImage(string Url, int BrowserWidth, int BrowserHeight, int ThumbnailWidth, int ThumbnailHeight)
    {
        this.Url = Url;
        this.BrowserWidth = BrowserWidth;
        this.BrowserHeight = BrowserHeight;
        this.ThumbnailHeight = ThumbnailHeight;
        this.ThumbnailWidth = ThumbnailWidth;
    }

    public string Url { set; get; }
    public int ThumbnailWidth { set; get; }
    public int ThumbnailHeight { set; get; }
    public int BrowserWidth { set; get; }
    public int BrowserHeight { set; get; }
    private Bitmap m_Bitmap = null;
    public Bitmap ThumbnailImage
    {
        get
        {
            return m_Bitmap;
        }
    }

    public Task<Bitmap> GenerateWebSiteThumbnailImage()
    {
        var tcs = new TaskCompletionSource<Bitmap>();
        WebBrowserDocumentCompletedEventHandler completed = null;
        WebBrowser m_WebBrowser = new WebBrowser();
        completed = (o, s) =>
        {
            _GenerateWebSiteThumbnailImageInternal(m_WebBrowser);
            m_WebBrowser.DocumentCompleted -= completed;
            m_WebBrowser.Dispose();
            tcs.TrySetResult(m_Bitmap);
        };
        m_WebBrowser.ScrollBarsEnabled = false;
        m_WebBrowser.ScriptErrorsSuppressed = true;
        m_WebBrowser.DocumentCompleted += completed;
        m_WebBrowser.Navigate(Url);
        return tcs.Task;
    }
    private void _GenerateWebSiteThumbnailImageInternal(WebBrowser m_WebBrowser)
    {
        m_WebBrowser.ClientSize = new Size(this.BrowserWidth, this.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(ThumbnailWidth, ThumbnailHeight, null, IntPtr.Zero);
    }
}