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
Bloccare l'esecuzione di un pod in mancanza di un'artifact attestation di GitHub
Gestire gli accessi con Token su Azure Container Registry
Anonimizzare i dati sensibili nei log di Azure Front Door
Escludere alcuni file da GitHub Copilot
Utilizzare il metodo IntersectBy per eseguire l'intersection di due liste
Esporre tool MCP con Azure Functions
Definire il metodo di rilascio in .NET Aspire
Definire il colore di una scrollbar HTML tramite CSS
Il nuovo controllo Range di Blazor 9
Utilizzare WebJobs su Linux con Azure App Service
Evitare memory leaks nelle closure JavaScript
Integrare un servizio esterno con .NET Aspire
I più letti di oggi
- Sfruttare una CDN con i bundle di ASP.NET
- Effettuare il multi-checkout in linea nelle pipeline di Azure DevOps
- Alleggerire le applicazioni WPF sfruttando gli oggetti Freezable
- Gli oggetti CallOut di Expression Blend 4.0
- Esaminare documenti XML con namespace utilizzando LINQ to XML
- Le DirectInk API nella Universal Windows Platform
- Inserire le news di Punto Informatico nel proprio sito


