2015-10-13 88 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