在 UWP 中保存图像然后在 WinForms 中加载
Saving Image In UWP Then Loading In WinForms
早上好 Whosebug,
今天我带着一个让我慢慢发疯的场景来找你。我希望你能帮助我解决这个问题,因为我确信这一定是可能的,但我自己无法解决。
我的问题是我目前正在处理两个不同的应用程序。第一个是 UWP 应用程序,用于为内部邮件系统传送包。这里的想法是,在收到包裹后,此人将使用 InkCanvas 签名签署应用程序。然后应该将其作为字节数组保存到数据库中,然后作为常规旧图像文件重新加载到 WinForm 或 WebForm 应用程序(我目前首先使用 WinForm 应用程序)中。但是,我绝对坚持在我从 UWP 获得的 WriteableBitmap 和我需要在 WinForms 中加载的常规位图之间进行转换。有什么想法吗?
这是我目前正在做的事情:
正在保存 UWP 图像:
private byte[] SaveImage()
{
var canvasStrokes = SignatureCanvas.InkPresenter.StrokeContainer.GetStrokes();
if (canvasStrokes.Count > 0)
{
var width = (int) SignatureCanvas.ActualWidth;
var height = (int) SignatureCanvas.ActualHeight;
var device = CanvasDevice.GetSharedDevice();
var renderTarget = new CanvasRenderTarget(device, width, height, 96);
using (var drawingSession = renderTarget.CreateDrawingSession())
{
drawingSession.Clear(Colors.White);
drawingSession.DrawInk(SignatureCanvas.InkPresenter.StrokeContainer.GetStrokes());
}
return renderTarget.GetPixelBytes();
}
return null;
}
然后我将字节保存到数据库中,然后在 WinForms 应用程序中从数据库中提取它们...所以我在这里犯了一些愚蠢的错误吗?我是否以错误的格式阅读签名?或者我是否需要做更多的事情来将格式从一种格式转换为另一种格式?
我很困惑,在从 Whosebug 页面尝试了许多不同的结果后,我不知道我做错了什么。
任何帮助都会很棒!对不起,如果我做了一些愚蠢的事情。
您实际上是在将原始位图数据保存到数据库中。
我不太记得 Winform 导入器是如何工作的,但我怀疑它是否可以导入原始位图数据。
您应该先将原始数据编码为 PNG 或 JPEG 图像并保存结果。您将以常规 old 图像文件结束,该文件应该可以从 Winform 中读取。
using (IRandomAccessStream stream = /* the stream where you want to save the data */)
{
byte[] bytes = renderTarget.GetPixelBytes();
var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, stream);
encoder.SetPixelData(BitmapPixelFormat.Bgra8,
BitmapAlphaMode.Ignore,
(uint)canvas.Width, (uint)canvas.Height,
96, 96, bytes);
await encoder.FlushAsync();
}
早上好 Whosebug,
今天我带着一个让我慢慢发疯的场景来找你。我希望你能帮助我解决这个问题,因为我确信这一定是可能的,但我自己无法解决。
我的问题是我目前正在处理两个不同的应用程序。第一个是 UWP 应用程序,用于为内部邮件系统传送包。这里的想法是,在收到包裹后,此人将使用 InkCanvas 签名签署应用程序。然后应该将其作为字节数组保存到数据库中,然后作为常规旧图像文件重新加载到 WinForm 或 WebForm 应用程序(我目前首先使用 WinForm 应用程序)中。但是,我绝对坚持在我从 UWP 获得的 WriteableBitmap 和我需要在 WinForms 中加载的常规位图之间进行转换。有什么想法吗?
这是我目前正在做的事情:
正在保存 UWP 图像:
private byte[] SaveImage()
{
var canvasStrokes = SignatureCanvas.InkPresenter.StrokeContainer.GetStrokes();
if (canvasStrokes.Count > 0)
{
var width = (int) SignatureCanvas.ActualWidth;
var height = (int) SignatureCanvas.ActualHeight;
var device = CanvasDevice.GetSharedDevice();
var renderTarget = new CanvasRenderTarget(device, width, height, 96);
using (var drawingSession = renderTarget.CreateDrawingSession())
{
drawingSession.Clear(Colors.White);
drawingSession.DrawInk(SignatureCanvas.InkPresenter.StrokeContainer.GetStrokes());
}
return renderTarget.GetPixelBytes();
}
return null;
}
然后我将字节保存到数据库中,然后在 WinForms 应用程序中从数据库中提取它们...所以我在这里犯了一些愚蠢的错误吗?我是否以错误的格式阅读签名?或者我是否需要做更多的事情来将格式从一种格式转换为另一种格式?
我很困惑,在从 Whosebug 页面尝试了许多不同的结果后,我不知道我做错了什么。
任何帮助都会很棒!对不起,如果我做了一些愚蠢的事情。
您实际上是在将原始位图数据保存到数据库中。 我不太记得 Winform 导入器是如何工作的,但我怀疑它是否可以导入原始位图数据。
您应该先将原始数据编码为 PNG 或 JPEG 图像并保存结果。您将以常规 old 图像文件结束,该文件应该可以从 Winform 中读取。
using (IRandomAccessStream stream = /* the stream where you want to save the data */)
{
byte[] bytes = renderTarget.GetPixelBytes();
var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, stream);
encoder.SetPixelData(BitmapPixelFormat.Bgra8,
BitmapAlphaMode.Ignore,
(uint)canvas.Width, (uint)canvas.Height,
96, 96, bytes);
await encoder.FlushAsync();
}