using System; using System.IO; using System.Linq; using SixLabors.ImageSharp; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing; using SixLabors.ImageSharp.Processing.Drawing; namespace porter_duff_tests { class Program { private static PixelBlenderMode[] CompositingOperators = { PixelBlenderMode.Src, PixelBlenderMode.Atop, PixelBlenderMode.Over, PixelBlenderMode.In, PixelBlenderMode.Out, PixelBlenderMode.Dest, PixelBlenderMode.DestAtop, PixelBlenderMode.DestOver, PixelBlenderMode.DestIn, PixelBlenderMode.DestOut, PixelBlenderMode.Clear, PixelBlenderMode.Xor }; private static PixelBlenderMode[] SeparableBlendedModes = { PixelBlenderMode.Normal, PixelBlenderMode.Multiply, PixelBlenderMode.Add, PixelBlenderMode.Substract, PixelBlenderMode.Screen, PixelBlenderMode.Darken, PixelBlenderMode.Lighten, PixelBlenderMode.Overlay, PixelBlenderMode.HardLight }; static void Main(string[] args) { Directory.CreateDirectory(FixPath("output")); Directory.CreateDirectory(FixPath("output/compositing/src-dest")); Directory.CreateDirectory(FixPath("output/compositing/dest-src")); Directory.CreateDirectory(FixPath("output/separable")); using (var src = Image.Load(FixPath("source.png"))) using (var dest = Image.Load(FixPath("dest.png"))) { foreach (var m in CompositingOperators) { using (var res = dest.Clone(x => x.Blend(src, new GraphicsOptions() { BlenderMode = m }))) { res.Save(FixPath($"output/compositing/src-dest/{m}.png")); } using (var res = src.Clone(x => x.Blend(dest, new GraphicsOptions() { BlenderMode = m }))) { res.Save(FixPath($"output/compositing/dest-src/{m}.png")); } } } using (var src = Image.Load(FixPath("ducky.png"))) using (var dest = Image.Load(FixPath("background.png"))) { foreach (var m in SeparableBlendedModes) { using (var res = dest.Clone(x => x.Blend(src, new GraphicsOptions() { BlenderMode = m }))) { res.Save(FixPath($"output/separable/{m}.png")); } } } } private static string FixPath(string s) { return $"../../../{s}"; } } }