所以您有几个问题:
- 如何在
Image
控件上使用InkCanvas
进行绘图。
- 如何将结果保存到文件中。
我将在此示例中使用简单的UWP应用程序,假设您的“Assets”文件夹中有“sample.jpg”文件,并且您的清单中具有“Pictures Library”功能。
要解决第一个问题,只需将InkCanvas
和Image
放置在同一个容器(如Grid
)中,但请记住顺序很重要:
<StackPanel Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Grid>
<Image Source="/Assets/sample.jpg"></Image>
<InkCanvas x:Name="ink"></InkCanvas>
</Grid>
<Button Content="Save"
Width="100"
Height="25"
HorizontalAlignment="Center"
VerticalAlignment="Center" Click="BtnSave_Click"/>
</StackPanel>
如果您首先放置 InkCanvas
(就像您在问题示例中所做的那样) - 它不起作用。但是,如果将 InkCanvas
放在最后 - 一切都正常工作,您可以在图像上绘制。
现在要解决第二个问题,您需要使用 Win2D(安装 nuget Win2D.uwp 包),因为标准的 RenderTargetBitmap
无法呈现 InkCanvas
的内容。首先绘制原始图像(直接从原始文件中获取原始源图像),然后绘制墨水画布的内容覆盖在其上。如果您添加 xaml,则 MainPage 的完整代码如下(您将拥有完整的工作示例):
public sealed partial class MainPage : Page {
public MainPage() {
this.InitializeComponent();
ink.InkPresenter.InputDeviceTypes = CoreInputDeviceTypes.Mouse | CoreInputDeviceTypes.Touch;
var attr = new InkDrawingAttributes();
attr.Color = Colors.Red;
attr.IgnorePressure = true;
attr.PenTip = PenTipShape.Circle;
attr.Size = new Size(4, 10);
ink.InkPresenter.UpdateDefaultDrawingAttributes(attr);
}
private async void BtnSave_Click(object sender, RoutedEventArgs e) {
StorageFolder storageFolder = KnownFolders.SavedPictures;
var file = await storageFolder.CreateFileAsync("output.jpg", CreationCollisionOption.ReplaceExisting);
CanvasDevice device = CanvasDevice.GetSharedDevice();
CanvasRenderTarget renderTarget = new CanvasRenderTarget(device, (int) ink.ActualWidth, (int) ink.ActualHeight, 96);
StorageFolder appInstalledFolder = Windows.ApplicationModel.Package.Current.InstalledLocation;
StorageFolder assets = await appInstalledFolder.GetFolderAsync("Assets");
var inputFile = await assets.GetFileAsync("sample.jpg");
using (var ds = renderTarget.CreateDrawingSession()) {
ds.Clear(Colors.White);
var image = await CanvasBitmap.LoadAsync(device, inputFile.Path);
ds.DrawImage(image);
ds.DrawInk(ink.InkPresenter.StrokeContainer.GetStrokes());
}
using (var fileStream = await file.OpenAsync(FileAccessMode.ReadWrite)) {
await renderTarget.SaveAsync(fileStream, CanvasBitmapFileFormat.Jpeg, 1f);
}
}
}
InkCanvas
不支持显示图像。您可以将图像放在 InkCanvas 下面,例如:<ScrollViewer><Grid><Image Source="<path>"></Image><InkCanvas x:Name="MyInkCanvas"></InkCanvas></Grid></ScrollViewer>
。 - Jayden