Използвам 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 първо с новата ширина и височина, тогава оригиналната повърхност изчезва и всичко, което получавам, е празно бяло изображение.
Как мога да преоразмеря повърхността на изгледа и да направя това да работи, без да създавам втори изглед?