2011-05-01 146 views
8

我想將我的畫布保存到位圖。我在網上找到了一些例子,但所有這些只保存黑色圖像(與我的畫布大小)。 我能做些什麼?將畫布保存到位圖

代碼:

public static void SaveCanvasToFile(Canvas surface, string filename) 
    { 
     Size size = new Size(surface.Width, surface.Height); 

     surface.Measure(size); 
     surface.Arrange(new Rect(size)); 

     // Create a render bitmap and push the surface to it 
     RenderTargetBitmap renderBitmap = 
      new RenderTargetBitmap(
      (int)size.Width, 
      (int)size.Height, 
      96d, 
      96d, 
      PixelFormats.Pbgra32); 
     renderBitmap.Render(surface); 

     // Create a file stream for saving image 
     using (FileStream outStream = new FileStream(filename, FileMode.Create)) 
     {    
      BmpBitmapEncoder encoder = new BmpBitmapEncoder(); 
      // push the rendered bitmap to it 
      encoder.Frames.Add(BitmapFrame.Create(renderBitmap)); 
      // save the data to the stream 
      encoder.Save(outStream); 
     }} 
+0

您是否使用調試器完成了這一步?有沒有什麼可疑的,比如'surface.Width'返回0? – 2011-05-01 20:29:25

+0

不,在調試器中,一切都看起來正常 – zc21 2011-05-01 20:42:58

+0

使用你的代碼我只是成功地呈現了一大堆(〜25)的控件(儘管我使用了ActualWidth和ActualHeight屬性,因爲我很少明確地設置大小) – 2011-05-01 21:16:16

回答

0

在我的渲染代碼,我叫target.UpdateLayout();target.Arrange(new Rect(size));後,也許這將修復它。另請注意,如果未設置畫布背景,則會將其呈現爲透明,而對BMP進行編碼時可能會變成純黑色,因此如果您只有黑色物體,它們可能不可見。

+0

我試過UpdateLayout()並沒有幫助。 – zc21 2011-05-01 21:01:13

+0

如果我編碼爲PNG,則獲取透明圖像,但畫布背景設置爲白色 – zc21 2011-05-01 21:02:17

+0

Canvas上是否應用了任何轉換? – 2011-05-01 21:03:57

10

嘗試這樣的回答:

public void ExportToPng(Uri path, Canvas surface) 
{ 
    if (path == null) return; 

    // Save current canvas transform 
    Transform transform = surface.LayoutTransform; 
    // reset current transform (in case it is scaled or rotated) 
    surface.LayoutTransform = null; 

    // Get the size of canvas 
    Size size = new Size(surface.Width, surface.Height); 
    // Measure and arrange the surface 
    // VERY IMPORTANT 
    surface.Measure(size); 
    surface.Arrange(new Rect(size)); 

    // Create a render bitmap and push the surface to it 
    RenderTargetBitmap renderBitmap = 
    new RenderTargetBitmap(
     (int)size.Width, 
     (int)size.Height, 
     96d, 
     96d, 
     PixelFormats.Pbgra32); 
    renderBitmap.Render(surface); 

    // Create a file stream for saving image 
    using (FileStream outStream = new FileStream(path.LocalPath, FileMode.Create)) 
    { 
    // Use png encoder for our data 
    PngBitmapEncoder encoder = new PngBitmapEncoder(); 
    // push the rendered bitmap to it 
    encoder.Frames.Add(BitmapFrame.Create(renderBitmap)); 
    // save the data to the stream 
    encoder.Save(outStream); 
    } 

    // Restore previously saved layout 
    surface.LayoutTransform = transform; 
} 

這個答案在這裏複製爲了方便從this page.

+0

這對我來說很好。實際上,我使用此代碼創建了數百個圖像,但是一旦這些代碼創建的圖像是黑色的。什麼可能是問題? – SST 2012-10-25 12:05:12

0
var fileName = "img.jpg"; 
var bitMap = new WriteableBitmap(DrawCanvas, null); 
var ms = new MemoryStream(); 
System.Windows.Media.Imaging.Extensions.SaveJpeg(bitMap, ms, bitMap.PixelWidth, bitMap.PixelHeight, 0, 100); 
ms.Seek(0, SeekOrigin.Begin); 
var library = new MediaLibrary(); 
library.SavePicture(string.Format("{0}", fileName), ms); 
0

注意

如果你的渲染是一個黑色的圖像,這是因爲你的尺寸不正確。

這是一個很好的例子給你:

RenderTargetBitmap rtb = new RenderTargetBitmap(width, height, mXdpi, mYdpi, System.Windows.Media.PixelFormats.Default); 
     rtb.Render(my_canvas); 

     BitmapEncoder pngEncoder = new PngBitmapEncoder(); 
     pngEncoder.Frames.Add(BitmapFrame.Create(rtb)); 

     using (var fs = System.IO.File.OpenWrite("test.png")) 
     { 
      pngEncoder.Save(fs); 
     } 

這個代碼從您的位圖,從你的畫布渲染保存爲PNG圖像。

希望可以幫助你。