将InkCanvas保存到字节数组到文件时,图像会受到损坏

时间:2017-11-24 01:44:18

标签: c# wpf drawing inkcanvas

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

编辑:也尝试过/没有保证金。以下是我尝试的其他链接:

https://social.msdn.microsoft.com/Forums/vstudio/en-US/ef71237c-5dfb-4d6c-a402-e8cb02b74e99/how-to-convert-inkcanvas-strokes-to-a-bitmap-or-byte-array?forum=wpf

Converting InkCanvas Strokes to a Byte Array and back again

InkCanvas Load/Save operations

http://www.centrolutions.com/Blog/post/2008/12/09/Convert-WPF-InkCanvas-to-Bitmap.aspx

https://social.msdn.microsoft.com/Forums/vstudio/en-US/ba4dc89f-0169-43a9-8374-68e1fb34a222/saving-inkcanvas-as-image?forum=wpf

我需要将结果文件作为位图/ 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: enter image description here

然后被破坏了: enter image description here

1 个答案:

答案 0 :(得分:3)

为避免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();
    }
}