【问题标题】:[C#][WPF] How to save multiple canvas as an image?[C#][WPF] 如何将多个画布保存为图像?
【发布时间】:2015-10-13 13:56:37
【问题描述】:

我只是环顾四周,试图制作一个将多个画布保存为一个图像的工作版本。例如,将它们保存在彼此附近会很好,但我不知道该怎么做。

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);
        }
    }

这就是我尝试过的方法,但它只保存了第一张图片。有人可以帮我解决这个问题吗?

更新

我纠正了@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);
        }
    }

【问题讨论】:

  • 您要保存为什么类型的图像?而且您将所有高度设置为宽度
  • 哦 png 刚刚看到了,尝试另存为 tiff 或支持多帧的东西...
  • 我修复了你所说的谢谢,但没有帮助

标签: c# wpf canvas


【解决方案1】:

您想要的不是多帧图像,而是通过并列组合画布的图像。所以实际上你在这里只需要 1 帧,但需要一个大的组合帧。有一些方法可以将它们结合起来,但是您可以通过一种简单的方法来使用 DrawingVisual。我们可以在该视觉对象上绘制绘图并使用RenderTargetBitmap 来捕获它。我们使用DrawingGroup 来组合ImageDrawings(来自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);
    }
}

【讨论】:

    猜你喜欢
    • 2019-10-19
    • 2014-02-20
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    • 2012-09-07
    • 2023-03-23
    • 2017-01-29
    相关资源
    最近更新 更多