La visualizzazione e la gestione di immagini sono operazioni molto ricorrenti in un'applicazione Windows Phone. Sebbene per la visualizzazione è disponibile il controllo Image, non è sempre lo strumento ideale e performante per la visualizzazione delle immagini. Può infatti valer la pena sostituire l'uso di una BitmapImage con un WriteableBitmap i cui pixel vanno riempiti per mostrare l'immagine.
Per farlo in Windows Phone esiste un extension method per il WriteableBitmap (namespace System.Windows.Media.Imaging), di nome LoadJpeg, che permette di decodificare un'immagine JPEG dato lo Stream di essa. L'unico requisito è aver preparato la WriteableBitmap con le dimensioni esatte dell'immagine da decodificare.
using System.Windows.Media.Imaging;
void Load()
{
// TODO: ottengo lo stream
Stream stream = null;
// Preparo la bitmap vuota
WriteableBitmap bitmap = new WriteableBitmap(60, 40);
ThreadPool.QueueUserWorkItem(s => {
using (stream)
bitmap.LoadJpeg(stream);
});
}La particolarità di questo metodo sta nel fatto che è possibile chiamarlo anche su thread diversi dal dispatcher, permettendo di effettuare il decoding in modo più leggero. In maniera simile, anche la classe PictureDecoder (namespace Microsoft.Phone) dispone del metodo statico DecodeJpeg, ma permette di omettere le dimensioni, poiché la WriteableBitmap viene calcolata e resituita dal metodo stesso. Questo però non consente di essere invocato su un thread diverso dallo UI.
Ritornando agli extension method, oltre al decoding è possibile fare l'enconding con il metodo SaveJpeg, specifcando lo Stream destinatario, le dimensioni, l'orientamento (non è supportato va messo sempre valore zero) e la qualità (da 0 a 100).
using System.Windows.Media.Imaging;
void Save()
{
WriteableBitmap bitmap = new WriteableBitmap(60, 40);
// TODO: preparo l'immagine
using (MemoryStream stream = new MemoryStream())
{
// Salvo. Dimensioni 60x40, qualità 90
bitmap.SaveJpeg(stream, bitmap.PixelWidth, bitmap.PixelHeight, 0, 90);
}
}Anche in questo caso il metodo non ha limiti sul thread che lo invoca.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Creare espressioni riutilizzabili nelle query LINQ per Entity Framework
Utilizzo delle stepped value functions nel CSS
Utilizzare il metodo ExceptBy per eseguire operazione di sottrazione tra liste
Utilizzare Containers in .NET Aspire
Recuperare le subissue e il loro stato di completamento in GitHub
Fissare una versione dell'agent nelle pipeline di Azure DevOps
Personalizzare le pagine di errore su Azure App Service
Utilizzare Intersect e Except per filtrare set di dati in TSql
Montare Azure Blob Storage su Linux con BlobFuse2
Effettuare un clone parziale di un repository di GitHub
Gestione ciclo di vita in .NET Aspire
Proteggere l'endpoint dell'agente A2A delle Logic App
I più letti di oggi
- Inserire le news di Punto Informatico nel proprio sito
- Effettuare il multi-checkout in linea nelle pipeline di Azure DevOps
- Esaminare documenti XML con namespace utilizzando LINQ to XML
- Alleggerire le applicazioni WPF sfruttando gli oggetti Freezable
- Effetto turnstile su tutte le pagine con il Windows Phone Toolkit
- Le DirectInk API nella Universal Windows Platform
- Sfruttare una CDN con i bundle di ASP.NET
- Gli oggetti CallOut di Expression Blend 4.0


