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
Abilitare il rolling update su Azure Functions flex consumption
Utilizzare WhenEach per processare i risultati di una lista di task
Usare i settings di serializzazione/deserializzazione di System.Text.Json di ASP.NET all'interno di un'applicazione non web
Potenziare la ricerca su Cosmos DB con Full Text Search
Dallo sviluppo locale ad Azure con .NET Aspire
Importare repository da Bitbucket a GitHub Enterprise Cloud
Abilitare automaticamente il force push di un gruppo su Azure DevOps
Montare Azure Blob Storage su Linux con BlobFuse2
Implementare il throttle in JavaScript
Integrare LLM alle nostre applicazioni in .NET con MCP
Rendere i propri workflow e le GitHub Action utilizzate più sicure
Introduzione ai web component HTML
I più letti di oggi
- Effettuare il multi-checkout in linea nelle pipeline di Azure DevOps
- Sfruttare una CDN con i bundle di ASP.NET
- Alleggerire le applicazioni WPF sfruttando gli oggetti Freezable
- Esaminare documenti XML con namespace utilizzando LINQ to XML
- Le DirectInk API nella Universal Windows Platform
- Gli oggetti CallOut di Expression Blend 4.0
- Inserire le news di Punto Informatico nel proprio sito


