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
Self-healing degli unit test con Copilot in GitHub
Utilizzare il Null conditional assignment di C# 14
Personalizzare i parametri del CSS Scroll Snap
Impostare il tipo di supporto dei campi Json in Entity Framework con Sql Server
Utilizzare Containers in .NET Aspire
Importare un servizio esterno in .NET Aspire
Mischiare codice server side e client side in una query LINQ con Entity Framework
Montare Azure Blob Storage su Linux con BlobFuse2
Gestione dei codeowners in GitHub
Nuova modale riconnessione Blazor
Semplificare la gestione dei modelli con Azure AI Foundry Model Router
Interagire con Azure DevOps tramite MCP Server
I più letti di oggi
- Future Dev Day - Milano
- Chiedilo ai tuoi dati: Fabric Data Agents in azione
- Community Days 2018: Web Day - Milano
- .NET Conference Italia 2023 - Milano e Online
- Global Azure 2026 - ASPItalia.com - Milano
- Disponibile la versione November 2008 del Silverlight Toolkit
- MIX 2011: tutte le novità in diretta da Las Vegas
- Le migliori applicazioni Open Source per il web




