2015-10-13 90 views
2

我只是環顧四周,試圖製作一個保存多個畫布作爲一個圖像的工作版本。例如,將它們保存在彼此附近會很好,但我無法弄清楚如何去做。[C#] [WPF]如何將多個畫布保存爲圖像?

public static void CreateSaveBitmap(Canvas canvas1, Canvas canvas2, string filename) 
    { 
     RenderTargetBitmap renderBitmap1 = new RenderTargetBitmap((int)canvas1.ActualWidth, (int)canvas1.ActualWidth, 96d, 96d, PixelFormats.Pbgra32); 
     // needed otherwise the image output is black 
     canvas1.Measure(new Size((int)canvas1.ActualWidth, (int)canvas1.ActualWidth)); 
     canvas1.Arrange(new Rect(new Size((int)canvas1.ActualWidth, (int)canvas1.ActualWidth))); 

     renderBitmap1.Render(canvas1); 

     RenderTargetBitmap renderBitmap2 = new RenderTargetBitmap((int)canvas2.ActualWidth, (int)canvas2.ActualWidth, 96d, 96d, PixelFormats.Pbgra32); 
     // needed otherwise the image output is black 
     canvas2.Measure(new Size((int)canvas2.ActualWidth, (int)canvas2.ActualWidth)); 
     canvas2.Arrange(new Rect(new Size((int)canvas2.ActualWidth, (int)canvas2.ActualWidth))); 

     renderBitmap2.Render(canvas2); 

     //JpegBitmapEncoder encoder = new JpegBitmapEncoder(); 
     PngBitmapEncoder encoder = new PngBitmapEncoder(); 

     encoder.Frames.Add(BitmapFrame.Create(renderBitmap1)); 
     encoder.Frames.Add(BitmapFrame.Create(renderBitmap2)); 
     using (FileStream file = File.Create(filename)) 
     { 
      encoder.Save(file); 
     } 
    } 

這是我如何嘗試,但它只保存第一張圖片。有人可以幫我解決這個問題嗎?

UPDATE

我糾正一些錯誤什麼叫被@TheLethalCoder,我也改變了輸出文件類型爲TIFF,但它並沒有幫助。這是現在的最新版本:

public static void CreateSaveBitmap(Canvas canvas1, Canvas canvas2, string filename) 
    { 
     RenderTargetBitmap renderBitmap1 = new RenderTargetBitmap((int)canvas1.ActualWidth, (int)canvas1.ActualHeight, 96d, 96d, PixelFormats.Pbgra32); 
     // needed otherwise the image output is black 
     canvas1.Measure(new Size((int)canvas1.ActualWidth, (int)canvas1.ActualHeight)); 
     canvas1.Arrange(new Rect(new Size((int)canvas1.ActualWidth, (int)canvas1.ActualHeight))); 

     renderBitmap1.Render(canvas1); 

     RenderTargetBitmap renderBitmap2 = new RenderTargetBitmap((int)canvas2.ActualWidth, (int)canvas2.ActualHeight, 96d, 96d, PixelFormats.Pbgra32); 
     // needed otherwise the image output is black 
     canvas2.Measure(new Size((int)canvas2.ActualWidth, (int)canvas2.ActualHeight)); 
     canvas2.Arrange(new Rect(new Size((int)canvas2.ActualWidth, (int)canvas2.ActualHeight))); 

     renderBitmap2.Render(canvas2); 

     //JpegBitmapEncoder encoder = new JpegBitmapEncoder(); 
     TiffBitmapEncoder encoder = new TiffBitmapEncoder(); 

     encoder.Frames.Add(BitmapFrame.Create(renderBitmap1)); 
     encoder.Frames.Add(BitmapFrame.Create(renderBitmap2)); 
     using (FileStream file = File.Create(filename)) 
     { 
      encoder.Save(file); 
     } 
    } 
+0

你想將其保存爲圖像類型的?並且您將所有高度設置爲寬度 – TheLethalCoder

+0

哦png剛剛看到它,嘗試將其保存爲tiff或支持多個幀的東西... – TheLethalCoder

+0

我修復了您說的謝謝,但它沒有幫助 – forgofe

回答

0

你想要的不是多幀圖像,而是通過並置你的畫布的圖像。所以實際上你只需要1幀,但是一個大的組合。有一些方法可以將它們結合起來,但有一個簡單的方法可以用DrawingVisual來完成。我們可以在該視覺上繪製圖形,並使用RenderTargetBitmap來捕捉它。我們使用DrawingGroup來合併ImageDrawing(來自2 RenderTargetBitmaps)。總之,我們必須執行以下步驟:從2個RenderTargetBitmaps中,將它們放入2個ImageDrawings並將它們組合到DrawingGroup中。然後,您在DrawingVisual上繪製組合的繪圖。最後使用RenderTargetBitmap來正常渲染該視覺效果。

下面是代碼,你可以嘗試一下:

public static void CreateSaveBitmap(Canvas canvas1, Canvas canvas2, string filename) 
{ 
    RenderTargetBitmap renderBitmap1 = new RenderTargetBitmap((int)canvas1.ActualWidth, (int)canvas1.ActualHeight, 96d, 96d, PixelFormats.Pbgra32); 

    canvas1.Measure(new Size((int)canvas1.ActualWidth, (int)canvas1.ActualHeight)); 
    canvas1.Arrange(new Rect(new Size((int)canvas1.ActualWidth, (int)canvas1.ActualHeight))); 

    renderBitmap1.Render(canvas1); 

    RenderTargetBitmap renderBitmap2 = new RenderTargetBitmap((int)canvas2.ActualWidth, (int)canvas2.ActualHeight, 96d, 96d, PixelFormats.Pbgra32); 

    canvas2.Measure(new Size((int)canvas2.ActualWidth, (int)canvas2.ActualHeight)); 
    canvas2.Arrange(new Rect(new Size((int)canvas2.ActualWidth, (int)canvas2.ActualHeight))); 

    renderBitmap2.Render(canvas2); 

    //Combine the images here 
    var dg = new DrawingGroup(); 
    var id1 = new ImageDrawing(renderBitmap1, 
           new Rect(0,0,renderBitmap1.Width, renderBitmap1.Height)); 
    var id2 = new ImageDrawing(renderBitmap2, 
           new Rect(renderBitmap1.Width, 0 
             renderBitmap2.Width, 
             renderBitmap2.Height)); 
    dg.Children.Add(id1); 
    dg.Children.Add(id2); 
    var combinedImg = new RenderTargetBitmap((int)(renderBitmap1.Width + renderBitmap2.Width + 0.5), 
          (int)(Math.Max(renderBitmap1.Height, renderBitmap2.Height) + 0.5), 96, 96, PixelFormats.Pbgra32); 
    var dv = new DrawingVisual(); 
    using(var dc = dv.RenderOpen()){ 
     dc.DrawDrawing(dg); 
    } 
    combinedImg.Render(dv); 

    //JpegBitmapEncoder encoder = new JpegBitmapEncoder(); 
    PngBitmapEncoder encoder = new PngBitmapEncoder(); 

    encoder.Frames.Add(BitmapFrame.Create(combinedImg)); 

    using (FileStream file = File.Create(filename)) { 
     encoder.Save(file); 
    } 
} 
+1

謝謝,這是工作正常! – forgofe