2013-03-01 37 views
1

我開始在C#中下發展,和我想的表面轉換成一個字節的緩衝區或一個畫面(以一個字節的緩衝區太后轉換)。Awesomium網頁視圖表面以字節的緩衝區或圖片框

我在其他問題看到這個代碼:

string fileName = Path.GetTempFileName(); 
webView2.Render().SaveToPng(fileName); 
byte[] bytes = File.ReadAllBytes(fileName); 
File.Delete(fileName); 
MemoryStream ms = new MemoryStream(bytes); 

但是,網頁視圖沒有渲染(),他不說,我需要導入的內容庫。

我停在這裏:

var view = (WebView)WebCore.Views.Last(); 
WebCore.Update(); 
BitmapSurface surface = (BitmapSurface)view.Surface; 
surface.?? 
+0

糾正我,如果我錯了,但在一個較低水平,圖像只是一個字節數組。你能從這個'BitmapSurface'獲取字節並從它創建一個'System.Drawing.Image'嗎? – 2013-03-01 20:57:20

+0

我想這樣做,但我不知道如何:/ – dkapa 2013-03-01 21:12:18

+0

'surface'變量有哪些屬性? – 2013-03-01 21:19:14

回答

8

最近在Awesomium中出現了許多無證的變化。

嘗試WebView.Surface,而不是WebView.Render

using (WebView vw = WebCore.CreateWebView(1024, 768)) { 
    vw.Source = new Uri("http://www.google.com"); 

    while (vw.IsLoading) { 
     WebCore.Update(); 
    } 
    ((BitmapSurface)vw.Surface).SaveToJPEG("D:\\google.jpg"); 
    PictureBox1.Load("D:\\google.jpg"); 
    WebCore.Shutdown(); 
} 

在評論中指出了另外一組更改。只是爲了正確,這是一個更新的代碼和文檔鏈接。

using (webView = WebCore.CreateWebView(800, 600)) 
{ 
    webView.Source = new Uri("http://www.google.com"); 

    view.LoadingFrameComplete += (s, e) => 
    { 
     if (!e.IsMainFrame) 
      return; 

     BitmapSurface surface = (BitmapSurface)view.Surface; 
     surface.SaveToPNG("result.png", true); 

     WebCore.Shutdown(); 
    } 
} 

WebCore.Run(); 

來源:http://docs.awesomium.net/html/b2fc3fe8-72bd-4baf-980f-b9b9456d5ca4.htm

+0

從Awesomium 1.7.5開始,此解決方案不再有效。看起來,(1)'WebCore.Update()'已經過時了,'(BitmapSurface)vw.Surface).SaveToJPEG(「D:\\ google.jpg」);'給出錯誤:'未處理的異常:系統。 NullReferenceException:對象引用未設置爲對象的實例。我試圖找出如何使它與更新後的軟件包一起工作,但文檔非常稀疏。 – Jonathan 2015-10-28 16:23:29

+0

以下是更新後的示例:http://docs.awesomium.net/html/b2fc3fe8-72bd-4baf-980f-b9b9456d5ca4.htm – 2015-11-05 18:16:16

-1

怎麼樣Buffer方法?這應該是你想要的。

+0

您能否向我解釋如何做?緩衝區是一個IntPtr ...但我不知道如何使用它 – dkapa 2013-03-01 21:30:29

+0

可能需要看看元帥類。從未使用過,但可能需要將緩衝區返回值轉換爲帶符號的32位整數,並使用類似'Marshal.ReadByte(IntegerPointer);' – 2013-03-01 21:35:51

2

你的意思是這樣的嗎?

private static byte[] getWebViewScreenshotAsBytes(ref WebView myWebView) 
{ 
    using (System.IO.MemoryStream ms = new System.IO.MemoryStream()) { 
     using (System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(myWebView.Width, myWebView.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb)) { 
      BitmapSurface bmpSurface = (BitmapSurface)myWebView.Surface; 
      BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.WriteOnly, bmp.PixelFormat); 
      bmpSurface.CopyTo(bmpData.Scan0, bmpSurface.RowSpan, 4, false, false); 
      bmp.UnlockBits(bmpData); 
      bmp.Save(ms, ImageFormat.Png); 
     } 
     return ms.ToArray(); 
    } 
} 
2
double width = 800; 
    double height = 1000; 
    var webView = WebCore.CreateWebView(width, height, WebViewType.Offscreen); 
    webView.Source = new Uri("https://www.google.com/"); 
    while (webView.IsLoading) 
    { 
    WebCore.Update(); 
    } 
    var bitmapSurface = (BitmapSurface)webView.Surface; 
    var writeableBitmap = new WriteableBitmap(width, height, 96, 96, PixelFormats.Bgra32, null); 
    writeableBitmap.Lock(); 
    bitmapSurface.CopyTo(writeableBitmap.BackBuffer, bitmapSurface.RowSpan, 4, false, false); 
    writeableBitmap.AddDirtyRect(new Int32Rect(0, 0, width, height)); 
    writeableBitmap.Unlock(); 
    var image = new Image(); 
    image.Source = writeableBitmap;