La classe RenderTargetBitmap introdotta già ai tempi di Windows 8, è spesso stata utilizzata per renderizzare come immagini (e salvarle) porzioni di UI in XAML per creare, ad esempio, delle live tile dai contenuti personalizzati. Questa classe, però, non funziona con tutti i controlli che sono esposti dal Windows Runtime, come può essere il caso del nuovo InkCanvas introdotto da Windows 10.
La classe InkCanvas, in particolare, espone già il metodo SaveAsync all'interno della proprietà StrokeContainer, ma l'output dell'immagine sarà un ISF (Ink Stroke Format), oppure una GIF con ISF: la loro particolarità, in entrambi i casi, è che riducono la qualità dell'immagine durante il salvataggio per poter ridurre al minimo le dimensioni.
Per ovviare a questo problema e mantenere la risoluzione originale che si vede all'interno dell'applicazione UWP, viene comodo sfruttare la classe CanvasDevice contenuta nel pacchetto di NuGet di Microsoft Win2d.uwp che permette di salvare qualsiasi tipo di contenuto, così come lo faceva la RenderTargetBitmap. Un esempio di codice è mostrato di seguito:
private async void OnSaveButtonClick(object sender, RoutedEventArgs e) { CanvasDevice device = CanvasDevice.GetSharedDevice(); CanvasRenderTarget renderTarget = new CanvasRenderTarget(device, (int)MyCanvas.ActualWidth, (int)MyCanvas.ActualHeight, 96); using (var ds = renderTarget.CreateDrawingSession()) { ds.Clear(Colors.White); ds.DrawInk(MyCanvas.InkPresenter.StrokeContainer.GetStrokes()); } StorageFolder storageFolder = ApplicationData.Current.LocalFolder; StorageFile file = await storageFolder.CreateFileAsync("myImage.jpg", CreationCollisionOption.ReplaceExisting); using (var fileStream = await file.OpenAsync(FileAccessMode.ReadWrite)) await renderTarget.SaveAsync(fileStream, CanvasBitmapFileFormat.Jpeg, 1f); }
Una volta ottenuto il canvas da salvare, nel nostro caso l'oggetto InkCanvas, sarà sufficiente aggiungere alla superficie dell'immagine, tramite il metodo DrawInk, tutti gli stroke avendo cura di eliminare il background bianco di default del canvas. Recuperato lo StorageFile dove si vuole salvare l'immagine, si può creare la JPG con il metodo SaveAsync.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Sfruttare al massimo i topic space di Event Grid MQTT
Disabilitare automaticamente un workflow di GitHub (parte 2)
Inference di dati strutturati da testo con Semantic Kernel e ASP.NET Core Web API
Ottimizzare le performance delle collection con le classi FrozenSet e FrozenDictionary
Eseguire query per recuperare il padre di un record che sfrutta il tipo HierarchyID in Entity Framework
Ottimizzare le pull con Artifact Cache di Azure Container Registry
Recuperare App Service cancellati su Azure
C# 12: Cosa c'è di nuovo e interessante
Usare le navigation property in QuickGrid di Blazor
Popolare una classe a partire dal testo, con Semantic Kernel e ASP.NET Core Web API
Sfruttare MQTT in cloud e in edge con Azure Event Grid
Eseguire una ricerca avanzata per recuperare le issue di GitHub
I più letti di oggi
- Build 2015: segui con noi tutte le novità per gli sviluppatori in diretta da San Francisco
- Speciale Windows Live Services: come integrarli nelle proprie applicazioni
- Rilasciata la RTM di SQL Server 2012, la versione Express subito in download
- Build 2014: tutte le novità per gli sviluppatori in diretta da San Francisco
- .NET Managed provider per MySQL
- WS-I approva Basic Profile 1.0
- Due regali dal Tech-Ed USA 2004: WSE 2.0 e VS 2005 Team System
- VS 2005 e SQL Server 2005 Express da scaricare
- Microsoft aggiorna WinFS beta 1 per VS 2005
- Utilizzare CLEditor per consentire l'input di HTML in ASP.NET MVC