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
Escludere alcuni file da GitHub Copilot
Proteggere l'endpoint dell'agente A2A delle Logic App
Supportare la crittografia di ASP.NET Core con Azure Container App
.NET Aspire per applicazioni distribuite
Integrazione di Copilot in .NET Aspire
Generare una User Delegation SAS in .NET per Azure Blob Storage
Scrivere selettori CSS più semplici ed efficienti con :is()
Rendere i propri workflow e le GitHub Action utilizzate più sicure
Utilizzare l'espressione if inline in una pipeline di Azure DevOps
Utilizzare i command service nei test con .NET Aspire
Selettore CSS :has() e i suoi casi d'uso avanzati
Keynote .NET Conference Italia 2025
I più letti di oggi
- Effettuare il multi-checkout in linea nelle pipeline di Azure DevOps
- Le DirectInk API nella Universal Windows Platform
- Alleggerire le applicazioni WPF sfruttando gli oggetti Freezable
- Esaminare documenti XML con namespace utilizzando LINQ to XML
- Sfruttare una CDN con i bundle di ASP.NET
- Effetto turnstile su tutte le pagine con il Windows Phone Toolkit
- Gli oggetti CallOut di Expression Blend 4.0


