所以,你有兩個問題:
- 如何使用
InkCanvas
在Image
控制借鑑。
- 如何將結果保存到文件中。
在本例中,我將使用簡單的UWP應用程序,該應用程序假定您的資產文件夾中有「sample.jpg」文件,並且清單中有「圖片庫」功能。
爲了解決第一個問題,只是把兩者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
內容。首先繪製原始圖像(直接從原始圖像中獲取圖像,例如從原始文件中獲取圖像),然後在其上繪製墨跡畫布的內容。 MainPage的完整代碼(如果您在上面添加xaml,將會有完整的工作示例):
public sealed partial class MainPage : Page {
public MainPage() {
this.InitializeComponent();
// just set some properties of ink canvas, not directly relevant to your question
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) {
// grab output file
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);
// grab your input file from Assets folder
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);
// draw your image first
ds.DrawImage(image);
// then draw contents of your ink canvas over it
ds.DrawInk(ink.InkPresenter.StrokeContainer.GetStrokes());
}
// save results
using (var fileStream = await file.OpenAsync(FileAccessMode.ReadWrite)) {
await renderTarget.SaveAsync(fileStream, CanvasBitmapFileFormat.Jpeg, 1f);
}
}
}
來源
2016-06-08 09:34:53
Evk
看起來'InkCanvas'不支持顯示圖像。您可以將圖像置於InkCanvas之下,例如:」> ScrollViewer>'。 –