Skip to main content
 首页 » 编程设计

c#之在 asp.net 中使用 webbrowser 将 html 页面转换为图像需要太多时间来生成重 html 页面的图像

2024年02月13日27myhome

当我使用 webbrowser 将 html 页面转换为图像时遇到问题,它花费了太多时间处理大量 html 页面。

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

应用程序.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); 
        } 
    } 

请您参考如下方法:

我稍微改变了你的类,它现在使用 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); 
    } 
}