Преоразмеряването на Awesomium WebView не преоразмерява повърхността

Използвам awesomium, за да направя моментна снимка на HTML страница.

public Bitmap renderHtml(string htmlContent)
    {
        using (WebSession session = WebCore.CreateWebSession(WebPreferences.Default))
        {
            int docHeight = 0, docWidth = 0;
            using (WebView view = WebCore.CreateWebView(1, 1, WebViewType.Offscreen))
            {

                bool finishedLoading = false;
                var uri = new Uri("data:text/html," + htmlContent, UriKind.Absolute);
                //uri = new Uri("http://www.google.com");
                view.Source = uri;
                view.LoadingFrameComplete += (s, e) =>
                    {
                        if (e.IsMainFrame)
                        {
                            finishedLoading = true;
                            docHeight = (int)view.ExecuteJavascriptWithResult("(function() { var bodyElmnt = document.body; var html = document.documentElement; var height = Math.max( bodyElmnt.scrollHeight, bodyElmnt.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight ); return height; })();");
                            docWidth = (int)view.ExecuteJavascriptWithResult("(function() { var bodyElmnt = document.body; var html = document.documentElement; var width = Math.max( bodyElmnt.scrollWidth, bodyElmnt.offsetWidth, html.clientWidth, html.scrollWidth, html.offsetWidth); return width; })();");
                        }
                    };
                while (!finishedLoading)
                {
                    Thread.Sleep(100);
                    WebCore.Update();
                }
                //view.Surface.Initialize(view, docWidth, docHeight);
                view.Resize(docWidth, docHeight);

                //cannot do this here because view.Surface size is (1,1)
                /*
                bmp = new Bitmap(docWidth, docHeight);
                BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.WriteOnly, bmp.PixelFormat);
                BitmapSurface bmpSurface = (BitmapSurface)view.Surface;
                bmpSurface.CopyTo(bmpData.Scan0, bmpSurface.RowSpan, 4, false, false);
                bmp.UnlockBits(bmpData);
                */ 
            }
            using (WebView view2 = WebCore.CreateWebView(docWidth, docHeight, WebViewType.Offscreen))
            {
                bool finishedLoading = false;
                var uri = new Uri("data:text/html," + htmlContent, UriKind.Absolute);

                view2.Source = uri;
                view2.LoadingFrameComplete += (s, e) =>
                {
                    if (e.IsMainFrame)
                    {
                        finishedLoading = true;
                    }
                };
                while (!finishedLoading)
                {
                    Thread.Sleep(100);
                    WebCore.Update();
                }
                bmp = new Bitmap(docWidth, docHeight);
                BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.WriteOnly, bmp.PixelFormat);
                BitmapSurface bmpSurface = (BitmapSurface)view2.Surface;
                bmpSurface.CopyTo(bmpData.Scan0, bmpSurface.RowSpan, 4, false, false);
                bmp.UnlockBits(bmpData);

            }
        }

        return bmp;
    }

Това работи, но трябва да създам втори изглед, като използвам размера на страницата, който получих от първия изглед, защото когато извикам view.Resize(), той не преоразмерява повърхността на изгледа, така че получавам грешка при опит да запазя изображението тъй като размерите са различни. Ако извикам Surface.Initialize първо с новата ширина и височина, тогава оригиналната повърхност изчезва и всичко, което получавам, е празно бяло изображение.

Как мога да преоразмеря повърхността на изгледа и да направя това да работи, без да създавам втори изглед?


person Adrian Buzea    schedule 05.06.2015    source източник


Отговори (1)


Не можете да използвате Surface на вашия WebView веднага след като преоразмерите своя WebView, тъй като отнема известно време, за да преоразмери, актуализира и преначертае. Актуализацията се извършва асинхронно, така че трябва да изчакате събитието Surface.Resized да се случи. Опитайте нещо подобно:

using (var vw = WebCore.CreateWebView(100,100))
{
    vw.Source = new Uri("website");
    while (vw.IsLoading)
    {
        WebCore.Update();
    }
    var surface = (BitmapSurface)vw.Surface;
    surface.SaveToPNG("screen1.png");
    surface.Resized += (s, e) =>
    {
        // Save the updated buffer to a new PNG image.
        surface.SaveToPNG("screen2.png");
        WebCore.Shutdown();
    };

    var x = vw.ExecuteJavascriptWithResult("document.body.scrollWidth").ToString();
    var y = vw.ExecuteJavascriptWithResult("document.body.scrollHeight").ToString();
    vw.Resize(Convert.ToInt32(x), Convert.ToInt32(y));

    WebCore.Run();
}

Този фрагмент от код ще отвори уебсайт, ще направи екранна снимка, след това ще преоразмери вашия уеб изглед, ще изчака Resized да се активира и ще направи друга екранна снимка.

Надявам се това да помогне.

person qwertchan    schedule 05.01.2016