Per sfruttare la crescente capacità degli schermi, in Windows 8 la qualità delle immagini è aumentata notevolmente e in WinRT queste vengono gestite al meglio per migliorare colori e dettagli.
Di contro è aumentato l'uso della memoria e dei cicli di CPU necessari per la loro visualizzazione; sebbene l'hardware a disposizione abbia notevoli prestazioni non dobbiamo trascurare le configurazioni che usano processori ARM, leggermente più limitati.
Per questi e comunque per tutte le app è consigliato usare le proprietà DecodePixelWidth e DecodePixelHeight, dell'oggetto BitmapImage, per fare in modo che l'oggetto prodotto dalla decodificata dell'immagine sia corrispondente alle dimensioni visualizzate a video.
Per comprendere le differenze che comportano l'uso di queste proprietà analizziamo il risultato a video e l'occupazione di memoria per un'immagine campione.
Nel markup dello snippet '1' impostiamo la proprietà Source di Image con una immagine JPG di 4 MB circa, di 4288x2848 pixel di dimensioni (la classica JPG di uno scatto con una moderna fotocamera digitale) e andiamo a forzare la sua dimensione a video con la consueta proprietà Width.
<!--1--> <Image Width="400"> <Image.Source> <BitmapImage UriSource="Assets/DSC_1987.JPG" /> </Image.Source> </Image> <!--2--> <Image Width="400"> <Image.Source> <BitmapImage UriSource="Assets/DSC_1987.JPG" DecodePixelWidth="400" /> </Image.Source> </Image>
Nello snippet '2', invece, usiamo DecodePixelWidth con un valore analogo alla proprietà Width.
L'immagine seguente rappresenta il Task Manager in cui possiamo vedere il consumo di memoria relativo ai due snippet di cui sopra, la differenza è molto evidente.

Di seguito possiamo vedere il risultato a video:

Se andiamo ad ingrandire le immagini a confronto possiamo apprezzare la diversa gestione che WinRT attua sui pixel.

Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Configuratione e utilizzo .NET Aspire CLI
Migliorare l'organizzazione delle risorse con Azure Policy
Potenziare la ricerca su Cosmos DB con Full Text Search
Utilizzare il metodo ExceptBy per eseguire operazione di sottrazione tra liste
Evitare memory leaks nelle closure JavaScript
Scrivere selettori CSS più semplici ed efficienti con :is()
Bloccare l'esecuzione di un pod in mancanza di un'artifact attestation di GitHub
Gestione CSS in Blazor con .NET 9
Integrare un servizio esterno con .NET Aspire
Gestire codice JavaScript con code splitting e lazy loading
Eseguire script pre e post esecuzione di un workflow di GitHub
Gestire eccezioni nei plugin di Semantic Kernel in ASP.NET Core Web API
I più letti di oggi
- Analizzare il contenuto di una issue con GitHub Models e AI
- Integrare OpenAI tramite Aspire
- Interagire con Azure DevOps tramite MCP Server
- .NET Conference Italia 2025 - Milano
- Creare un agente A2Acon Azure Logic Apps
- The Agentic Day - Milano
- Usare la libreria PredicateBuilder per eseguire query tramite Entity Framework che usano or su più campi