(UWP) 在图像上绘图并再次保存为 image/byte 数组
(UWP) Drawing on image and saving as image/byte array again
这两天我尝试了很多不同的解决方案,但似乎找不到最好的方法。
我想要的是:
1. Show image
2. Enable drawing red lines on image
3. Save image with lines
我已经尝试过 Win2D、WriteableBitmapEx、InkCanvas、普通 Canvas 和 Lumia Imaging SDK,但没有找到可行的解决方案。我做错的可能性很大,因为所有这些解决方案都不适合我。不过,我似乎找不到任何适用于 UWP 的好例子。任何人都知道一个简单易行的方法吗?
编辑:我正在用 C# 开发
1) 第一种解决方案是使用DX。您可以使用 Direct2D 和 DirectWrite 渲染到屏幕,然后使用 WIC API 将渲染图像保存到磁盘。如果您正在编写 Windows 应用商店应用程序,您可以让用户 select 使用 Windows::Storage::Pickers::FileSavePicker 一个目标文件。 Here你可以找到一个示例程序。
更完整的在UWP中使用DX渲染或保存图片的示例,可以参考here。
2) 如果你想使用纯c#,win2D是direct2D的一个很好的包装器,它可以用来绘制图像。借助 RenderTargetBitmap,您可以将任意 UIElement 渲染为位图。关于 RenderTargetBitmap,这里是 MSDN paper, and here 是很好的示例。
对于您的情况,代码可能如下所示(您可以稍后保存到文件):
XAML:
<StackPanel>
<Button Content="Save as image source" Click="SaveImageSource_Click" />
<Grid x:Name="RenderedGrid" Height="500" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<canvas:CanvasControl Draw="CanvasControl_Draw" ClearColor="CornflowerBlue"/>
<Image x:Name="RenderedImage" Stretch="None" />
</Grid>
</StackPanel>
C#:
private void CanvasControl_Draw(CanvasControl sender, CanvasDrawEventArgs args)
{
args.DrawingSession.DrawEllipse(155, 155, 80, 30, Colors.Black, 3);
args.DrawingSession.DrawLine(155, 155, 180, 180, Colors.Red);
}
private async void SaveImageSource_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap();
await renderTargetBitmap.RenderAsync(RenderedGrid, 500, 500);
RenderedImage.Source = renderTargetBitmap;
}
如有不明之处请告诉我。
这两天我尝试了很多不同的解决方案,但似乎找不到最好的方法。
我想要的是:
1. Show image
2. Enable drawing red lines on image
3. Save image with lines
我已经尝试过 Win2D、WriteableBitmapEx、InkCanvas、普通 Canvas 和 Lumia Imaging SDK,但没有找到可行的解决方案。我做错的可能性很大,因为所有这些解决方案都不适合我。不过,我似乎找不到任何适用于 UWP 的好例子。任何人都知道一个简单易行的方法吗?
编辑:我正在用 C# 开发
1) 第一种解决方案是使用DX。您可以使用 Direct2D 和 DirectWrite 渲染到屏幕,然后使用 WIC API 将渲染图像保存到磁盘。如果您正在编写 Windows 应用商店应用程序,您可以让用户 select 使用 Windows::Storage::Pickers::FileSavePicker 一个目标文件。 Here你可以找到一个示例程序。
更完整的在UWP中使用DX渲染或保存图片的示例,可以参考here。
2) 如果你想使用纯c#,win2D是direct2D的一个很好的包装器,它可以用来绘制图像。借助 RenderTargetBitmap,您可以将任意 UIElement 渲染为位图。关于 RenderTargetBitmap,这里是 MSDN paper, and here 是很好的示例。
对于您的情况,代码可能如下所示(您可以稍后保存到文件):
XAML:
<StackPanel>
<Button Content="Save as image source" Click="SaveImageSource_Click" />
<Grid x:Name="RenderedGrid" Height="500" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<canvas:CanvasControl Draw="CanvasControl_Draw" ClearColor="CornflowerBlue"/>
<Image x:Name="RenderedImage" Stretch="None" />
</Grid>
</StackPanel>
C#:
private void CanvasControl_Draw(CanvasControl sender, CanvasDrawEventArgs args)
{
args.DrawingSession.DrawEllipse(155, 155, 80, 30, Colors.Black, 3);
args.DrawingSession.DrawLine(155, 155, 180, 180, Colors.Red);
}
private async void SaveImageSource_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap();
await renderTargetBitmap.RenderAsync(RenderedGrid, 500, 500);
RenderedImage.Source = renderTargetBitmap;
}
如有不明之处请告诉我。