Qualche settimana fa abbiamo visto come sia facile applicare un effetto Sepia ad una immagine tramite le Composition API della Universal Windows Platform. Tuttavia, pur essendo un layer abbastanza ricco, le Composition API risultano meno ricche di effetti rispetto alle Win2D API. Questo però non rappresenta un problema, poiché è possibile combinare due o più effetti per creare delle nuove maschere altrimenti irraggiungibili. Un esempio di chaining di due effetti è riportato in basso.
private void MainPageLoaded(object sender, RoutedEventArgs e) { ContainerVisual containerEffectImage = CanvasDraw.GetVisual(); var _compositor = containerEffectImage.Compositor; var _imageFactory = CompositionImageFactory.CreateCompositionImageFactory(_compositor); var sepiaVisual = _compositor.CreateSpriteVisual(); sepiaVisual.Size = new Vector2(208, 208); containerEffectImage.Children.InsertAtTop(sepiaVisual); var normalVisual = _compositor.CreateSpriteVisual(); normalVisual.Size = new Vector2(208, 208); var uri = new Uri("ms-appx:///Assets/Pics/mvp.png"); CompositionSurfaceBrush surfaceBrush = _compositor.CreateSurfaceBrush(); surfaceBrush.Surface = _imageFactory.CreateImageFromUri(uri).Surface; ArithmeticCompositeEffect m_effect = new ArithmeticCompositeEffect { Source1 = new SaturationEffect { Saturation = 0, Source = new CompositionEffectSourceParameter("source") }, Source2 = new InvertEffect { Source = new CompositionEffectSourceParameter("source") } }; var effectFactory = _compositor.CreateEffectFactory(m_effect); var effectBrush = effectFactory.CreateBrush(); sepiaVisual.Brush = effectBrush; normalVisual.Brush = surfaceBrush; effectBrush.SetSourceParameter("source", surfaceBrush); }
Come possiamo intuire, la magia risiede nella classe ArithmeticCompositeEffect, che presi in ingresso due sorgenti, li applica sequenzialmente alla nostra immagine. Ecco alcuni esempi al variare del parametro Saturation, rispettivamente: 0.5, 0 e 1.

Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Utilizzare l nesting nativo dei CSS
Ottimizzare le pull con Artifact Cache di Azure Container Registry
Usare i settings di serializzazione/deserializzazione di System.Text.Json di ASP.NET all'interno di un'applicazione non web
Sfruttare gli embedding e la ricerca vettoriale con Azure SQL Database
Filtering sulle colonne in una QuickGrid di Blazor
Creare una custom property in GitHub
Aggiornare a .NET 9 su Azure App Service
Utilizzare DeepSeek R1 con Azure AI
Utilizzare EF.Constant per evitare la parametrizzazione di query SQL
Proteggere le risorse Azure con private link e private endpoints
Creare una libreria CSS universale - Rotazione degli elementi
Ottimizzare le performance usando Span<T> e il metodo Split