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
Aprire una finestra di dialogo per selezionare una directory in WPF e .NET 8
Utilizzare politiche di resiliency con Azure Container App
Utilizzare gRPC su App Service di Azure
Utilizzare database e servizi con gli add-on di Container App
Utilizzare Tailwind CSS all'interno di React: primi componenti
Migrare una service connection a workload identity federation in Azure DevOps
Utilizzare il metodo CountBy di LINQ per semplificare raggruppamenti e i conteggi
Usare le navigation property in QuickGrid di Blazor
Configurare il nome della run di un workflow di GitHub in base al contesto di esecuzione
Creare una libreria CSS universale: Cards
Eseguire una query su SQL Azure tramite un workflow di GitHub
Rinnovare il token di una GitHub App durante l'esecuzione di un workflow
I più letti di oggi
- ora è la volta di #azure. http://aspitalia.com/build-win8 #BldWin
- Implementare il pattern Dispose del .NET Framework
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Utilizzare la cancellazione logica in #azure Container Registry https://aspit.co/ccy di @CristianCivera
- Centrare elementi in HTML tramite CSS
- Annunciato #PowerBI Embedded e disponibile in preview a partire da oggi! https://aspit.co/build2016 #build2016
- con il code inspector si potrà vedere il codice server associato all'HTML prodotto, ... http://aspitalia.com/build-win8 #BldWin
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!