Creare un'immagine dallo XAML di una Windows Store app

di Alessio Leoncini, in WinRT 8.1,

Nell'SDK di WinRT di Windows 8.1 abbiamo a disposizione la classe RenderTargetBitmap che ci permette di trasformare un markup XAML in una immagine.

Poichè RenderTargetBitmap eredita da ImageSource, possiamo utilizzarlo per valorizzare la proprietà Source di un Image per renderizzare una bitmap di un complesso visual tree di oggetti definiti nel markup; l'elaborazione scatta richiamando il metodo RenderAsync che accetta come parametri lo UIElement da 'appiattire' e facoltativamente anche le dimensioni finali della bitmap.

var renderTargetBitmap = new RenderTargetBitmap(); 
await renderTargetBitmap.RenderAsync(myGrid, _width, _height); 
myImage.Source = renderTargetBitmap;

Con il metodo GetPixelsAsync, inoltre, possiamo recuperare l'array di byte corrispondente all'immagine per, ad esempio, salvarlo su file system con FileSavePicker.

var pixelBuffer = await renderTargetBitmap.GetPixelsAsync();

var savePicker = new FileSavePicker();
savePicker.FileTypeChoices.Add(".png", new List<string> { ".png" }); 
var file = await savePicker.PickSaveFileAsync();

using (var stream = await file.OpenAsync(FileAccessMode.ReadWrite))
{
  var encoder = await
    BitmapEncoder.CreateAsync(BitmapEncoder.BmpEncoderId, stream);

  encoder.SetPixelData(
    BitmapPixelFormat.Bgra8,
    BitmapAlphaMode.Ignore,
    (uint)renderTargetBitmap.PixelWidth,
    (uint)renderTargetBitmap.PixelHeight,
    DisplayInformation.GetForCurrentView().LogicalDpi,
    DisplayInformation.GetForCurrentView().LogicalDpi,
    pixelBuffer.ToArray());

  await encoder.FlushAsync();
}

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi