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 il trigger SQL con le Azure Function
Utilizzare gRPC su App Service di Azure
Creare una libreria CSS universale: Clip-path
Introduzione alle Container Queries
Sfruttare GPT-4o realtime su Azure Open AI per conversazioni vocali
Utilizzare la funzione EF.Parameter per forzare la parametrizzazione di una costante con Entity Framework
Generare un hash con SHA-3 in .NET
Proteggere le risorse Azure con private link e private endpoints
Creare una libreria CSS universale: Nav menu
Gestione degli eventi nei Web component HTML
Testare l'invio dei messaggi con Event Hubs Data Explorer
Selettore CSS :has() e i suoi casi d'uso avanzati
I più letti di oggi
- Creare agenti facilmente con Azure AI Agent Service
- Loggare le query più lente con Entity Framework
- Rendere i propri workflow e le GitHub Action utilizzate più sicure
- Usare i settings di serializzazione/deserializzazione di System.Text.Json di ASP.NET all'interno di un'applicazione non web
- Disabilitare le run concorrenti di una pipeline di Azure DevOps
- Gestione degli eventi nei Web component HTML
- Fornire parametri ad un Web component HTML
- Introduzione ai web component HTML
- Documentare i servizi REST con Swagger e OpenAPI con .NET 9