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