C# 将InkCanvas保存到字节数组到文件时,图像被损坏

C# 将InkCanvas保存到字节数组到文件时,图像被损坏,c#,wpf,drawing,inkcanvas,C#,Wpf,Drawing,Inkcanvas,我有一个使用InkCanvas的WPF应用程序。当我渲染位图,保存到内存流,将结果字节写入文件,然后在paint中打开该文件时,图像被破坏。知道我做错了什么吗?在SO和codeproject上尝试了几种解决方案。很明显,它捕获了InkCanvas的一部分,但大部分是黑色的(我假设为空字节) 编辑:也尝试使用/不使用边距。以下是我尝试过的其他链接: 我需要的结果文件是一个位图/PNG,以便它可以在另一台机器上查看 private byte[] ConvertInkCanvasToByte

我有一个使用InkCanvas的WPF应用程序。当我渲染位图,保存到内存流,将结果字节写入文件,然后在paint中打开该文件时,图像被破坏。知道我做错了什么吗?在SO和codeproject上尝试了几种解决方案。很明显,它捕获了InkCanvas的一部分,但大部分是黑色的(我假设为空字节)

编辑:也尝试使用/不使用边距。以下是我尝试过的其他链接:

我需要的结果文件是一个位图/PNG,以便它可以在另一台机器上查看

private byte[] ConvertInkCanvasToByteArray()
{ 
    int margin = (int)this.icSignature.Margin.Left;
    int width = (int)this.icSignature.ActualWidth - margin;
    int height = (int)this.icSignature.ActualHeight - margin;

    RenderTargetBitmap rtb = new RenderTargetBitmap(width, height, 96d, 96d, PixelFormats.Default);
    rtb.Render(icSignature);

    BmpBitmapEncoder encoder = new BmpBitmapEncoder();
    encoder.Frames.Add(BitmapFrame.Create(rtb));
    byte[] bitmapBytes;
    using (MemoryStream ms = new MemoryStream())
    {
        encoder.Save(ms); 
        ms.Position = 0;
        bitmapBytes = ms.ToArray();
    }
    return bitmapBytes;
}
从InkCanvas:

然后弄坏了:

为了避免InkCanvas的边距出现任何问题,您可以将其绘制到中间DrawingVisual中:

private byte[] ConvertInkCanvasToByteArray()
{
    var rect = new Rect(icSignature.RenderSize);
    var visual = new DrawingVisual();

    using (var dc = visual.RenderOpen())
    {
        dc.DrawRectangle(new VisualBrush(icSignature), null, rect);
    }

    var rtb = new RenderTargetBitmap(
        (int)rect.Width, (int)rect.Height, 96d, 96d, PixelFormats.Default);
    rtb.Render(visual);

    var encoder = new PngBitmapEncoder();
    encoder.Frames.Add(BitmapFrame.Create(rtb));

    using (var stream = new MemoryStream())
    {
        encoder.Save(stream);
        return stream.ToArray();
    }
}

为了避免InkCanvas的边距出现任何问题,您可以将其绘制到中间DrawingVisual中:

private byte[] ConvertInkCanvasToByteArray()
{
    var rect = new Rect(icSignature.RenderSize);
    var visual = new DrawingVisual();

    using (var dc = visual.RenderOpen())
    {
        dc.DrawRectangle(new VisualBrush(icSignature), null, rect);
    }

    var rtb = new RenderTargetBitmap(
        (int)rect.Width, (int)rect.Height, 96d, 96d, PixelFormats.Default);
    rtb.Render(visual);

    var encoder = new PngBitmapEncoder();
    encoder.Frames.Add(BitmapFrame.Create(rtb));

    using (var stream = new MemoryStream())
    {
        encoder.Save(stream);
        return stream.ToArray();
    }
}

谢谢@Clemens,这完美地解决了问题。非常感谢!谢谢@Clemens,这完美地解决了问题。非常感谢!