Ejemplo n.º 1
0
        public void _1DarkBlueRect_2BlendBlackEllipse <TPixel>(
            TestImageProvider <TPixel> provider,
            PixelColorBlendingMode blending,
            PixelAlphaCompositionMode composition)
            where TPixel : unmanaged, IPixel <TPixel>
        {
            using (Image <TPixel> dstImg = provider.GetImage(), srcImg = provider.GetImage())
            {
                int scaleX = dstImg.Width / 100;
                int scaleY = dstImg.Height / 100;

                dstImg.Mutate(
                    x => x.Fill(
                        Color.DarkBlue,
                        new Rectangle(0 * scaleX, 40 * scaleY, 100 * scaleX, 20 * scaleY)));

                srcImg.Mutate(
                    x => x.Fill(
                        Color.Black,
                        new EllipsePolygon(40 * scaleX, 50 * scaleY, 50 * scaleX, 50 * scaleY)));

                dstImg.Mutate(
                    x => x.DrawImage(srcImg, new GraphicsOptions {
                    Antialias = true, ColorBlendingMode = blending, AlphaCompositionMode = composition
                }));

                VerifyImage(provider, blending, composition, dstImg);
            }
        }
#pragma warning disable IDE1006 // Naming Styles
#pragma warning disable SA1300  // Element should begin with upper-case letter
        public void _1DarkBlueRect_2BlendHotPinkRect <TPixel>(
            TestImageProvider <TPixel> provider,
            PixelColorBlendingMode blending,
            PixelAlphaCompositionMode composition)
            where TPixel : unmanaged, IPixel <TPixel>
#pragma warning restore SA1300  // Element should begin with upper-case letter
#pragma warning restore IDE1006 // Naming Styles
        {
            using (Image <TPixel> img = provider.GetImage())
            {
                int scaleX = img.Width / 100;
                int scaleY = img.Height / 100;
                img.Mutate(
                    x => x.Fill(
                        Color.DarkBlue,
                        new Rectangle(0 * scaleX, 40 * scaleY, 100 * scaleX, 20 * scaleY))

                    .Fill(
                        new ShapeGraphicsOptions
                {
                    GraphicsOptions =
                    {
                        Antialias = true, ColorBlendingMode = blending, AlphaCompositionMode = composition
                    }
                },
                        Color.HotPink,
                        new Rectangle(20 * scaleX, 0 * scaleY, 30 * scaleX, 100 * scaleY)));

                VerifyImage(provider, blending, composition, img);
            }
        }
        public void PorterDuffOutputIsCorrect(TestImageProvider <Rgba32> provider, PixelAlphaCompositionMode mode)
        {
            var srcFile = TestFile.Create(TestImages.Png.PDSrc);

            using (Image <Rgba32> src = srcFile.CreateRgba32Image())
                using (Image <Rgba32> dest = provider.GetImage())
                {
                    var options = new GraphicsOptions
                    {
                        Antialias            = false,
                        AlphaCompositionMode = mode
                    };

                    using (Image <Rgba32> res = dest.Clone(x => x.DrawImage(src, options)))
                    {
                        string combinedMode = mode.ToString();

                        if (combinedMode != "Src" && combinedMode.StartsWith("Src"))
                        {
                            combinedMode = combinedMode.Substring(3);
                        }

                        res.DebugSave(provider, combinedMode);
                        res.CompareToReferenceOutput(provider, combinedMode);
                    }
                }
        }
        public void _1DarkBlueRect_2BlendHotPinkRect <TPixel>(
            TestImageProvider <TPixel> provider,
            PixelColorBlendingMode blending,
            PixelAlphaCompositionMode composition)
            where TPixel : struct, IPixel <TPixel>
        {
            using (Image <TPixel> img = provider.GetImage())
            {
                int scaleX = img.Width / 100;
                int scaleY = img.Height / 100;
                img.Mutate(
                    x => x.Fill(
                        Color.DarkBlue,
                        new Rectangle(0 * scaleX, 40 * scaleY, 100 * scaleX, 20 * scaleY)
                        )
                    .Fill(
                        new GraphicsOptions {
                    Antialias = true, ColorBlendingMode = blending, AlphaCompositionMode = composition
                },
                        Color.HotPink,
                        new Rectangle(20 * scaleX, 0 * scaleY, 30 * scaleX, 100 * scaleY))
                    );

                VerifyImage(provider, blending, composition, img);
            }
        }
#pragma warning disable IDE1006 // Naming Styles
#pragma warning disable SA1300  // Element should begin with upper-case letter
        public void _1DarkBlueRect_2BlendBlackEllipse <TPixel>(
            TestImageProvider <TPixel> provider,
            PixelColorBlendingMode blending,
            PixelAlphaCompositionMode composition)
            where TPixel : unmanaged, IPixel <TPixel>
#pragma warning restore SA1300  // Element should begin with upper-case letter
#pragma warning restore IDE1006 // Naming Styles
        {
            using (Image <TPixel> dstImg = provider.GetImage(), srcImg = provider.GetImage())
            {
                int scaleX = dstImg.Width / 100;
                int scaleY = dstImg.Height / 100;

                dstImg.Mutate(
                    x => x.Fill(
                        Color.DarkBlue,
                        new Rectangle(0 * scaleX, 40 * scaleY, 100 * scaleX, 20 * scaleY)));

                srcImg.Mutate(
                    x => x.Fill(
                        Color.Black,
                        new EllipsePolygon(40 * scaleX, 50 * scaleY, 50 * scaleX, 50 * scaleY)));

                dstImg.Mutate(
                    x => x.DrawImage(srcImg, new GraphicsOptions {
                    Antialias = true, ColorBlendingMode = blending, AlphaCompositionMode = composition
                }));

                VerifyImage(provider, blending, composition, dstImg);
            }
        }
        public void _1DarkBlueRect_2BlendBlackEllipse <TPixel>(
            TestImageProvider <TPixel> provider,
            PixelColorBlendingMode blending,
            PixelAlphaCompositionMode composition)
            where TPixel : struct, IPixel <TPixel>
        {
            using (Image <TPixel> dstImg = provider.GetImage(), srcImg = provider.GetImage())
            {
                int scaleX = (dstImg.Width / 100);
                int scaleY = (dstImg.Height / 100);

                dstImg.Mutate(
                    x => x.Fill(
                        NamedColors <TPixel> .DarkBlue,
                        new Rectangle(0 * scaleX, 40 * scaleY, 100 * scaleX, 20 * scaleY)));

                srcImg.Mutate(
                    x => x.Fill(
                        NamedColors <TPixel> .Black,
                        new Shapes.EllipsePolygon(40 * scaleX, 50 * scaleY, 50 * scaleX, 50 * scaleY)));

                dstImg.Mutate(
                    x => x.DrawImage(srcImg, new GraphicsOptions(true)
                {
                    ColorBlendingMode = blending, AlphaCompositionMode = composition
                })
                    );

                VerifyImage(provider, blending, composition, dstImg);
            }
        }
        public void _1DarkBlueRect_2BlendHotPinkRect_3BlendTransparentEllipse <TPixel>(
            TestImageProvider <TPixel> provider,
            PixelColorBlendingMode blending,
            PixelAlphaCompositionMode composition)
            where TPixel : struct, IPixel <TPixel>
        {
            using (Image <TPixel> img = provider.GetImage())
            {
                int scaleX = img.Width / 100;
                int scaleY = img.Height / 100;
                img.Mutate(
                    x => x.Fill(
                        NamedColors <TPixel> .DarkBlue,
                        new Rectangle(0 * scaleX, 40 * scaleY, 100 * scaleX, 20 * scaleY)));
                img.Mutate(
                    x => x.Fill(
                        new GraphicsOptions(true)
                {
                    ColorBlendingMode = blending, AlphaCompositionMode = composition
                },
                        NamedColors <TPixel> .HotPink,
                        new Rectangle(20 * scaleX, 0 * scaleY, 30 * scaleX, 100 * scaleY)));
                img.Mutate(
                    x => x.Fill(
                        new GraphicsOptions(true)
                {
                    ColorBlendingMode = blending, AlphaCompositionMode = composition
                },
                        NamedColors <TPixel> .Transparent,
                        new Shapes.EllipsePolygon(40 * scaleX, 50 * scaleY, 50 * scaleX, 50 * scaleY))
                    );

                VerifyImage(provider, blending, composition, img);
            }
        }
        public void DefaultGraphicsOptionsAlphaCompositionMode()
        {
            const PixelAlphaCompositionMode Expected = PixelAlphaCompositionMode.SrcOver;

            Assert.Equal(Expected, this.newGraphicsOptions.AlphaCompositionMode);
            Assert.Equal(Expected, this.cloneGraphicsOptions.AlphaCompositionMode);
        }
 /// <summary>
 /// Draws the given image together with the current one by blending their pixels.
 /// </summary>
 /// <param name="source">The image this method extends.</param>
 /// <param name="image">The image to blend with the currently processing image.</param>
 /// <param name="colorBlending">The color blending mode.</param>
 /// <param name="alphaComposition">The alpha composition mode.</param>
 /// <param name="opacity">The opacity of the image to blend. Must be between 0 and 1.</param>
 /// <returns>The <see cref="Image{TPixelDst}"/>.</returns>
 public static IImageProcessingContext DrawImage(
     this IImageProcessingContext source,
     Image image,
     PixelColorBlendingMode colorBlending,
     PixelAlphaCompositionMode alphaComposition,
     float opacity) =>
 source.ApplyProcessor(new DrawImageProcessor(image, Point.Empty, colorBlending, alphaComposition, opacity));
Ejemplo n.º 10
0
 /// <summary>
 /// Initializes a new instance of the <see cref="GraphicsOptions"/> struct.
 /// </summary>
 /// <param name="enableAntialiasing">If set to <c>true</c> [enable antialiasing].</param>
 public GraphicsOptions(bool enableAntialiasing)
 {
     this.colorBlendingMode      = PixelColorBlendingMode.Normal;
     this.alphaCompositionMode   = PixelAlphaCompositionMode.SrcOver;
     this.blendPercentage        = 1;
     this.antialiasSubpixelDepth = 16;
     this.antialias = enableAntialiasing;
 }
Ejemplo n.º 11
0
        /// <summary>
        /// Initializes a new instance of the <see cref="GraphicsOptions"/> struct.
        /// </summary>
        /// <param name="enableAntialiasing">If set to <c>true</c> [enable antialiasing].</param>
        /// <param name="opacity">blending percentage to apply to the drawing operation</param>
        /// <param name="blending">color blending mode to apply to the drawing operation</param>
        /// <param name="composition">alpha composition mode to apply to the drawing operation</param>
        public GraphicsOptions(bool enableAntialiasing, PixelColorBlendingMode blending, PixelAlphaCompositionMode composition, float opacity)
        {
            Guard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));

            this.colorBlendingMode      = blending;
            this.alphaCompositionMode   = composition;
            this.blendPercentage        = opacity;
            this.antialiasSubpixelDepth = 16;
            this.antialias = enableAntialiasing;
        }
Ejemplo n.º 12
0
 /// <summary>
 /// Initializes a new instance of the <see cref="DrawImageProcessor"/> class.
 /// </summary>
 /// <param name="image">The image to blend.</param>
 /// <param name="location">The location to draw the blended image.</param>
 /// <param name="colorBlendingMode">The blending mode to use when drawing the image.</param>
 /// <param name="alphaCompositionMode">The Alpha blending mode to use when drawing the image.</param>
 /// <param name="opacity">The opacity of the image to blend.</param>
 public DrawImageProcessor(
     Image image,
     Point location,
     PixelColorBlendingMode colorBlendingMode,
     PixelAlphaCompositionMode alphaCompositionMode,
     float opacity)
 {
     this.Image                = image;
     this.Location             = location;
     this.ColorBlendingMode    = colorBlendingMode;
     this.AlphaCompositionMode = alphaCompositionMode;
     this.Opacity              = opacity;
 }
        /// <summary>
        /// Initializes a new instance of the <see cref="DrawImageProcessor{TPixelDst, TPixelSrc}"/> class.
        /// </summary>
        /// <param name="image">The image to blend with the currently processing image.</param>
        /// <param name="location">The location to draw the blended image.</param>
        /// <param name="colorBlendingMode">The blending mode to use when drawing the image.</param>
        /// <param name="alphaCompositionMode">The Alpha blending mode to use when drawing the image.</param>
        /// <param name="opacity">The opacity of the image to blend. Must be between 0 and 1.</param>
        public DrawImageProcessor(
            Image <TPixelFg> image,
            Point location,
            PixelColorBlendingMode colorBlendingMode,
            PixelAlphaCompositionMode alphaCompositionMode,
            float opacity)
        {
            Guard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));

            this.Image   = image;
            this.Opacity = opacity;
            this.Blender = PixelOperations <TPixelBg> .Instance.GetPixelBlender(colorBlendingMode, alphaCompositionMode);

            this.Location = location;
        }
Ejemplo n.º 14
0
        /// <summary>
        /// Initializes a new instance of the <see cref="TextGraphicsOptions" /> struct.
        /// </summary>
        /// <param name="enableAntialiasing">If set to <c>true</c> [enable antialiasing].</param>
        public TextGraphicsOptions(bool enableAntialiasing)
        {
            this.applyKerning        = true;
            this.tabWidth            = 4;
            this.wrapTextWidth       = 0;
            this.horizontalAlignment = HorizontalAlignment.Left;
            this.verticalAlignment   = VerticalAlignment.Top;

            this.antialiasSubpixelDepth = 16;
            this.colorBlendingMode      = PixelColorBlendingMode.Normal;
            this.alphaCompositionMode   = PixelAlphaCompositionMode.SrcOver;
            this.blendPercentage        = 1;
            this.antialias = enableAntialiasing;
            this.dpiX      = DefaultTextDpi;
            this.dpiY      = DefaultTextDpi;
        }
Ejemplo n.º 15
0
        /// <summary>
        /// Initializes a new instance of the <see cref="T:SixLabors.ImageSharp.Processing.Processors.Drawing.DrawImageProcessor`2" /> class.
        /// </summary>
        /// <param name="configuration">The configuration which allows altering default behaviour or extending the library.</param>
        /// <param name="image">The foreground <see cref="T:SixLabors.ImageSharp.Image`1" /> to blend with the currently processing image.</param>
        /// <param name="source">The source <see cref="T:SixLabors.ImageSharp.Image`1" /> for the current processor instance.</param>
        /// <param name="sourceRectangle">The source area to process for the current processor instance.</param>
        /// <param name="location">The location to draw the blended image.</param>
        /// <param name="colorBlendingMode">The blending mode to use when drawing the image.</param>
        /// <param name="alphaCompositionMode">The Alpha blending mode to use when drawing the image.</param>
        /// <param name="interpolationValue">The interpolation progress. Must be between 0 and 1.</param>
        public InterpolateProcessor(Configuration configuration,
                                    SixLabors.ImageSharp.Image <TPixelFg> image,
                                    SixLabors.ImageSharp.Image <TPixelBg> source,
                                    SixLabors.ImageSharp.Rectangle sourceRectangle,
                                    Point location,
                                    PixelColorBlendingMode colorBlendingMode,
                                    PixelAlphaCompositionMode alphaCompositionMode,
                                    float interpolationValue) : base(configuration, source, sourceRectangle)
        {
            //	Guard.MustBeBetweenOrEqualTo(opacity, 0.0f, 1f, nameof(opacity));
            this.Image = image;
            this.InterpolationValue = interpolationValue;
            this.Blender            = PixelOperations <TPixelBg> .Instance.GetPixelBlender(colorBlendingMode, alphaCompositionMode);

            this.Location = location;
        }
#pragma warning disable IDE1006 // Naming Styles
#pragma warning disable SA1300  // Element should begin with upper-case letter
        public void _1DarkBlueRect_2BlendHotPinkRect_3BlendSemiTransparentRedEllipse <TPixel>(
            TestImageProvider <TPixel> provider,
            PixelColorBlendingMode blending,
            PixelAlphaCompositionMode composition)
            where TPixel : unmanaged, IPixel <TPixel>
#pragma warning restore SA1300  // Element should begin with upper-case letter
#pragma warning restore IDE1006 // Naming Styles
        {
            using (Image <TPixel> img = provider.GetImage())
            {
                int scaleX = img.Width / 100;
                int scaleY = img.Height / 100;
                img.Mutate(
                    x => x.Fill(
                        Color.DarkBlue,
                        new Rectangle(0 * scaleX, 40, 100 * scaleX, 20 * scaleY)));
                img.Mutate(
                    x => x.Fill(
                        new DrawingOptions
                {
                    GraphicsOptions = new GraphicsOptions {
                        Antialias = true, ColorBlendingMode = blending, AlphaCompositionMode = composition
                    }
                },
                        Color.HotPink,
                        new Rectangle(20 * scaleX, 0, 30 * scaleX, 100 * scaleY)));

                Color transparentRed = Color.Red.WithAlpha(0.5f);

                img.Mutate(
                    x => x.Fill(
                        new DrawingOptions
                {
                    GraphicsOptions = new GraphicsOptions {
                        Antialias = true, ColorBlendingMode = blending, AlphaCompositionMode = composition
                    }
                },
                        transparentRed,
                        new EllipsePolygon(40 * scaleX, 50 * scaleY, 50 * scaleX, 50 * scaleY)));

                VerifyImage(provider, blending, composition, img);
            }
        }
        public void _1DarkBlueRect_2BlendHotPinkRect_3BlendSemiTransparentRedEllipse <TPixel>(
            TestImageProvider <TPixel> provider,
            PixelColorBlendingMode blending,
            PixelAlphaCompositionMode composition)
            where TPixel : unmanaged, IPixel <TPixel>
        {
            using (Image <TPixel> img = provider.GetImage())
            {
                int scaleX = (img.Width / 100);
                int scaleY = (img.Height / 100);
                img.Mutate(
                    x => x.Fill(
                        Color.DarkBlue,
                        new Rectangle(0 * scaleX, 40, 100 * scaleX, 20 * scaleY)));
                img.Mutate(
                    x => x.Fill(
                        new ShapeGraphicsOptions
                {
                    GraphicsOptions = new GraphicsOptions {
                        Antialias = true, ColorBlendingMode = blending, AlphaCompositionMode = composition
                    }
                },
                        Color.HotPink,
                        new Rectangle(20 * scaleX, 0, 30 * scaleX, 100 * scaleY)));

                Color transparentRed = Color.Red.WithAlpha(0.5f);

                img.Mutate(
                    x => x.Fill(
                        new ShapeGraphicsOptions
                {
                    GraphicsOptions = new GraphicsOptions {
                        Antialias = true, ColorBlendingMode = blending, AlphaCompositionMode = composition
                    }
                },
                        transparentRed,
                        new EllipsePolygon(40 * scaleX, 50 * scaleY, 50 * scaleX, 50 * scaleY))
                    );

                VerifyImage(provider, blending, composition, img);;
            }
        }
        public void _1DarkBlueRect_2BlendHotPinkRect_3BlendSemiTransparentRedEllipse <TPixel>(
            TestImageProvider <TPixel> provider,
            PixelColorBlendingMode blending,
            PixelAlphaCompositionMode composition)
            where TPixel : struct, IPixel <TPixel>
        {
            using (Image <TPixel> img = provider.GetImage())
            {
                int scaleX = (img.Width / 100);
                int scaleY = (img.Height / 100);
                img.Mutate(
                    x => x.Fill(
                        NamedColors <TPixel> .DarkBlue,
                        new Rectangle(0 * scaleX, 40, 100 * scaleX, 20 * scaleY)));
                img.Mutate(
                    x => x.Fill(
                        new GraphicsOptions(true)
                {
                    ColorBlendingMode = blending, AlphaCompositionMode = composition
                },
                        NamedColors <TPixel> .HotPink,
                        new Rectangle(20 * scaleX, 0, 30 * scaleX, 100 * scaleY)));
                var c = NamedColors <TPixel> .Red.ToVector4();

                c.W *= 0.5f;
                var pixel = default(TPixel);
                pixel.FromVector4(c);

                img.Mutate(
                    x => x.Fill(
                        new GraphicsOptions(true)
                {
                    ColorBlendingMode = blending, AlphaCompositionMode = composition
                },
                        pixel,
                        new Shapes.EllipsePolygon(40 * scaleX, 50 * scaleY, 50 * scaleX, 50 * scaleY))
                    );

                VerifyImage(provider, blending, composition, img);;
            }
        }
        private static void VerifyImage <TPixel>(
            TestImageProvider <TPixel> provider,
            PixelColorBlendingMode blending,
            PixelAlphaCompositionMode composition,
            Image <TPixel> img)
            where TPixel : struct, IPixel <TPixel>
        {
            img.DebugSave(
                provider,
                new { composition, blending },
                appendPixelTypeToFileName: false,
                appendSourceFileOrDescription: false);

            var comparer = ImageComparer.TolerantPercentage(0.01f, 3);

            img.CompareFirstFrameToReferenceOutput(comparer,
                                                   provider,
                                                   new { composition, blending },
                                                   appendPixelTypeToFileName: false,
                                                   appendSourceFileOrDescription: false);
        }
 /// <summary>
 /// Draws the given image together with the current one by blending their pixels.
 /// </summary>
 /// <typeparam name="TPixel">The pixel format.</typeparam>
 /// <param name="source">The image this method extends.</param>
 /// <param name="image">The image to blend with the currently processing image.</param>
 /// <param name="location">The location to draw the blended image.</param>
 /// <param name="colorBlending">The color blending to apply.</param>
 /// <param name="alphaComposition">The alpha composition mode.</param>
 /// <param name="opacity">The opacity of the image to blend. Must be between 0 and 1.</param>
 /// <returns>The <see cref="Image{TPixel}"/>.</returns>
 public static IImageProcessingContext <TPixel> DrawImage <TPixel>(this IImageProcessingContext <TPixel> source, Image <TPixel> image, Point location, PixelColorBlendingMode colorBlending, PixelAlphaCompositionMode alphaComposition, float opacity)
     where TPixel : struct, IPixel <TPixel>
 => source.ApplyProcessor(new DrawImageProcessor <TPixel>(image, location, colorBlending, alphaComposition, opacity));
Ejemplo n.º 21
0
 /// <summary>
 /// Draws the given image together with the current one by blending their pixels.
 /// </summary>
 /// <typeparam name="TPixelDst">The pixel format of the destination image.</typeparam>
 /// <typeparam name="TPixelSrc">The pixel format of the source image.</typeparam>
 /// <param name="source">The image this method extends.</param>
 /// <param name="image">The image to blend with the currently processing image.</param>
 /// <param name="colorBlending">The color blending mode.</param>
 /// <param name="alphaComposition">The alpha composition mode.</param>
 /// <param name="opacity">The opacity of the image to blend. Must be between 0 and 1.</param>
 /// <returns>The <see cref="Image{TPixelDst}"/>.</returns>
 public static IImageProcessingContext <TPixelDst> DrawImage <TPixelDst, TPixelSrc>(this IImageProcessingContext <TPixelDst> source, Image <TPixelSrc> image, PixelColorBlendingMode colorBlending, PixelAlphaCompositionMode alphaComposition, float opacity)
     where TPixelDst : struct, IPixel <TPixelDst>
     where TPixelSrc : struct, IPixel <TPixelSrc>
 => source.ApplyProcessor(new DrawImageProcessor <TPixelDst, TPixelSrc>(image, Point.Empty, colorBlending, alphaComposition, opacity));
Ejemplo n.º 22
0
        public void TestAlphaCompositionModes(Rgba32 backdrop, Rgba32 source, float opacity, PixelAlphaCompositionMode mode, Rgba32 expectedResult)
        {
            PixelBlender <Rgba32> blender = PixelOperations <Rgba32> .Instance.GetPixelBlender(PixelColorBlendingMode.Normal, mode);

            Rgba32 actualResult = blender.Blend(backdrop, source, opacity);

            // var str = actualResult.Rgba.ToString("X8"); // used to extract expectedResults
            Assert.Equal(actualResult.ToVector4(), expectedResult.ToVector4());
        }
Ejemplo n.º 23
0
        public static IImageProcessingContext <TPixel> SetAlphaMask <TPixel>(this IImageProcessingContext <TPixel> source, Image <Alpha8> mask, PixelAlphaCompositionMode mode) where TPixel : struct, IPixel <TPixel>
        {
            if (mask == null)
            {
                return(source);
            }

            return(source.Apply
                   (
                       img =>
            {
                if (mask.Width == img.Width && mask.Height == img.Height)
                {
                    using (var rmask = mask.CloneAs <TPixel>())
                    {
                        img.Mutate(dc => dc.DrawImage(rmask, PixelColorBlendingMode.Normal, mode, 1));
                    }
                }
                else
                {
                    using (var rmask = mask.CloneAs <TPixel>())
                    {
                        rmask.Mutate(dc => dc.Resize(img.Width, img.Height));
                        img.Mutate(dc => dc.DrawImage(rmask, PixelColorBlendingMode.Normal, mode, 1));
                    }
                }
            }
                   ));
        }
        /// <summary>
        /// Find an instance of the pixel blender.
        /// </summary>
        /// <param name="colorMode">The color blending mode to apply</param>
        /// <param name="alphaMode">The alpha composition mode to apply</param>
        /// <returns>A <see cref="PixelBlender{TPixel}"/>.</returns>
        public virtual PixelBlender <TPixel> GetPixelBlender(PixelColorBlendingMode colorMode, PixelAlphaCompositionMode alphaMode)
        {
            switch (alphaMode)
            {
            case PixelAlphaCompositionMode.Clear:
                switch (colorMode)
                {
                case PixelColorBlendingMode.Multiply: return(DefaultPixelBlenders <TPixel> .MultiplyClear.Instance);

                case PixelColorBlendingMode.Add: return(DefaultPixelBlenders <TPixel> .AddClear.Instance);

                case PixelColorBlendingMode.Subtract: return(DefaultPixelBlenders <TPixel> .SubtractClear.Instance);

                case PixelColorBlendingMode.Screen: return(DefaultPixelBlenders <TPixel> .ScreenClear.Instance);

                case PixelColorBlendingMode.Darken: return(DefaultPixelBlenders <TPixel> .DarkenClear.Instance);

                case PixelColorBlendingMode.Lighten: return(DefaultPixelBlenders <TPixel> .LightenClear.Instance);

                case PixelColorBlendingMode.Overlay: return(DefaultPixelBlenders <TPixel> .OverlayClear.Instance);

                case PixelColorBlendingMode.HardLight: return(DefaultPixelBlenders <TPixel> .HardLightClear.Instance);

                case PixelColorBlendingMode.Normal:
                default: return(DefaultPixelBlenders <TPixel> .NormalClear.Instance);
                }

            case PixelAlphaCompositionMode.Xor:
                switch (colorMode)
                {
                case PixelColorBlendingMode.Multiply: return(DefaultPixelBlenders <TPixel> .MultiplyXor.Instance);

                case PixelColorBlendingMode.Add: return(DefaultPixelBlenders <TPixel> .AddXor.Instance);

                case PixelColorBlendingMode.Subtract: return(DefaultPixelBlenders <TPixel> .SubtractXor.Instance);

                case PixelColorBlendingMode.Screen: return(DefaultPixelBlenders <TPixel> .ScreenXor.Instance);

                case PixelColorBlendingMode.Darken: return(DefaultPixelBlenders <TPixel> .DarkenXor.Instance);

                case PixelColorBlendingMode.Lighten: return(DefaultPixelBlenders <TPixel> .LightenXor.Instance);

                case PixelColorBlendingMode.Overlay: return(DefaultPixelBlenders <TPixel> .OverlayXor.Instance);

                case PixelColorBlendingMode.HardLight: return(DefaultPixelBlenders <TPixel> .HardLightXor.Instance);

                case PixelColorBlendingMode.Normal:
                default: return(DefaultPixelBlenders <TPixel> .NormalXor.Instance);
                }

            case PixelAlphaCompositionMode.Src:
                switch (colorMode)
                {
                case PixelColorBlendingMode.Multiply: return(DefaultPixelBlenders <TPixel> .MultiplySrc.Instance);

                case PixelColorBlendingMode.Add: return(DefaultPixelBlenders <TPixel> .AddSrc.Instance);

                case PixelColorBlendingMode.Subtract: return(DefaultPixelBlenders <TPixel> .SubtractSrc.Instance);

                case PixelColorBlendingMode.Screen: return(DefaultPixelBlenders <TPixel> .ScreenSrc.Instance);

                case PixelColorBlendingMode.Darken: return(DefaultPixelBlenders <TPixel> .DarkenSrc.Instance);

                case PixelColorBlendingMode.Lighten: return(DefaultPixelBlenders <TPixel> .LightenSrc.Instance);

                case PixelColorBlendingMode.Overlay: return(DefaultPixelBlenders <TPixel> .OverlaySrc.Instance);

                case PixelColorBlendingMode.HardLight: return(DefaultPixelBlenders <TPixel> .HardLightSrc.Instance);

                case PixelColorBlendingMode.Normal:
                default: return(DefaultPixelBlenders <TPixel> .NormalSrc.Instance);
                }

            case PixelAlphaCompositionMode.SrcAtop:
                switch (colorMode)
                {
                case PixelColorBlendingMode.Multiply: return(DefaultPixelBlenders <TPixel> .MultiplySrcAtop.Instance);

                case PixelColorBlendingMode.Add: return(DefaultPixelBlenders <TPixel> .AddSrcAtop.Instance);

                case PixelColorBlendingMode.Subtract: return(DefaultPixelBlenders <TPixel> .SubtractSrcAtop.Instance);

                case PixelColorBlendingMode.Screen: return(DefaultPixelBlenders <TPixel> .ScreenSrcAtop.Instance);

                case PixelColorBlendingMode.Darken: return(DefaultPixelBlenders <TPixel> .DarkenSrcAtop.Instance);

                case PixelColorBlendingMode.Lighten: return(DefaultPixelBlenders <TPixel> .LightenSrcAtop.Instance);

                case PixelColorBlendingMode.Overlay: return(DefaultPixelBlenders <TPixel> .OverlaySrcAtop.Instance);

                case PixelColorBlendingMode.HardLight: return(DefaultPixelBlenders <TPixel> .HardLightSrcAtop.Instance);

                case PixelColorBlendingMode.Normal:
                default: return(DefaultPixelBlenders <TPixel> .NormalSrcAtop.Instance);
                }

            case PixelAlphaCompositionMode.SrcIn:
                switch (colorMode)
                {
                case PixelColorBlendingMode.Multiply: return(DefaultPixelBlenders <TPixel> .MultiplySrcIn.Instance);

                case PixelColorBlendingMode.Add: return(DefaultPixelBlenders <TPixel> .AddSrcIn.Instance);

                case PixelColorBlendingMode.Subtract: return(DefaultPixelBlenders <TPixel> .SubtractSrcIn.Instance);

                case PixelColorBlendingMode.Screen: return(DefaultPixelBlenders <TPixel> .ScreenSrcIn.Instance);

                case PixelColorBlendingMode.Darken: return(DefaultPixelBlenders <TPixel> .DarkenSrcIn.Instance);

                case PixelColorBlendingMode.Lighten: return(DefaultPixelBlenders <TPixel> .LightenSrcIn.Instance);

                case PixelColorBlendingMode.Overlay: return(DefaultPixelBlenders <TPixel> .OverlaySrcIn.Instance);

                case PixelColorBlendingMode.HardLight: return(DefaultPixelBlenders <TPixel> .HardLightSrcIn.Instance);

                case PixelColorBlendingMode.Normal:
                default: return(DefaultPixelBlenders <TPixel> .NormalSrcIn.Instance);
                }

            case PixelAlphaCompositionMode.SrcOut:
                switch (colorMode)
                {
                case PixelColorBlendingMode.Multiply: return(DefaultPixelBlenders <TPixel> .MultiplySrcOut.Instance);

                case PixelColorBlendingMode.Add: return(DefaultPixelBlenders <TPixel> .AddSrcOut.Instance);

                case PixelColorBlendingMode.Subtract: return(DefaultPixelBlenders <TPixel> .SubtractSrcOut.Instance);

                case PixelColorBlendingMode.Screen: return(DefaultPixelBlenders <TPixel> .ScreenSrcOut.Instance);

                case PixelColorBlendingMode.Darken: return(DefaultPixelBlenders <TPixel> .DarkenSrcOut.Instance);

                case PixelColorBlendingMode.Lighten: return(DefaultPixelBlenders <TPixel> .LightenSrcOut.Instance);

                case PixelColorBlendingMode.Overlay: return(DefaultPixelBlenders <TPixel> .OverlaySrcOut.Instance);

                case PixelColorBlendingMode.HardLight: return(DefaultPixelBlenders <TPixel> .HardLightSrcOut.Instance);

                case PixelColorBlendingMode.Normal:
                default: return(DefaultPixelBlenders <TPixel> .NormalSrcOut.Instance);
                }

            case PixelAlphaCompositionMode.Dest:
                switch (colorMode)
                {
                case PixelColorBlendingMode.Multiply: return(DefaultPixelBlenders <TPixel> .MultiplyDest.Instance);

                case PixelColorBlendingMode.Add: return(DefaultPixelBlenders <TPixel> .AddDest.Instance);

                case PixelColorBlendingMode.Subtract: return(DefaultPixelBlenders <TPixel> .SubtractDest.Instance);

                case PixelColorBlendingMode.Screen: return(DefaultPixelBlenders <TPixel> .ScreenDest.Instance);

                case PixelColorBlendingMode.Darken: return(DefaultPixelBlenders <TPixel> .DarkenDest.Instance);

                case PixelColorBlendingMode.Lighten: return(DefaultPixelBlenders <TPixel> .LightenDest.Instance);

                case PixelColorBlendingMode.Overlay: return(DefaultPixelBlenders <TPixel> .OverlayDest.Instance);

                case PixelColorBlendingMode.HardLight: return(DefaultPixelBlenders <TPixel> .HardLightDest.Instance);

                case PixelColorBlendingMode.Normal:
                default: return(DefaultPixelBlenders <TPixel> .NormalDest.Instance);
                }

            case PixelAlphaCompositionMode.DestAtop:
                switch (colorMode)
                {
                case PixelColorBlendingMode.Multiply: return(DefaultPixelBlenders <TPixel> .MultiplyDestAtop.Instance);

                case PixelColorBlendingMode.Add: return(DefaultPixelBlenders <TPixel> .AddDestAtop.Instance);

                case PixelColorBlendingMode.Subtract: return(DefaultPixelBlenders <TPixel> .SubtractDestAtop.Instance);

                case PixelColorBlendingMode.Screen: return(DefaultPixelBlenders <TPixel> .ScreenDestAtop.Instance);

                case PixelColorBlendingMode.Darken: return(DefaultPixelBlenders <TPixel> .DarkenDestAtop.Instance);

                case PixelColorBlendingMode.Lighten: return(DefaultPixelBlenders <TPixel> .LightenDestAtop.Instance);

                case PixelColorBlendingMode.Overlay: return(DefaultPixelBlenders <TPixel> .OverlayDestAtop.Instance);

                case PixelColorBlendingMode.HardLight: return(DefaultPixelBlenders <TPixel> .HardLightDestAtop.Instance);

                case PixelColorBlendingMode.Normal:
                default: return(DefaultPixelBlenders <TPixel> .NormalDestAtop.Instance);
                }

            case PixelAlphaCompositionMode.DestIn:
                switch (colorMode)
                {
                case PixelColorBlendingMode.Multiply: return(DefaultPixelBlenders <TPixel> .MultiplyDestIn.Instance);

                case PixelColorBlendingMode.Add: return(DefaultPixelBlenders <TPixel> .AddDestIn.Instance);

                case PixelColorBlendingMode.Subtract: return(DefaultPixelBlenders <TPixel> .SubtractDestIn.Instance);

                case PixelColorBlendingMode.Screen: return(DefaultPixelBlenders <TPixel> .ScreenDestIn.Instance);

                case PixelColorBlendingMode.Darken: return(DefaultPixelBlenders <TPixel> .DarkenDestIn.Instance);

                case PixelColorBlendingMode.Lighten: return(DefaultPixelBlenders <TPixel> .LightenDestIn.Instance);

                case PixelColorBlendingMode.Overlay: return(DefaultPixelBlenders <TPixel> .OverlayDestIn.Instance);

                case PixelColorBlendingMode.HardLight: return(DefaultPixelBlenders <TPixel> .HardLightDestIn.Instance);

                case PixelColorBlendingMode.Normal:
                default: return(DefaultPixelBlenders <TPixel> .NormalDestIn.Instance);
                }

            case PixelAlphaCompositionMode.DestOut:
                switch (colorMode)
                {
                case PixelColorBlendingMode.Multiply: return(DefaultPixelBlenders <TPixel> .MultiplyDestOut.Instance);

                case PixelColorBlendingMode.Add: return(DefaultPixelBlenders <TPixel> .AddDestOut.Instance);

                case PixelColorBlendingMode.Subtract: return(DefaultPixelBlenders <TPixel> .SubtractDestOut.Instance);

                case PixelColorBlendingMode.Screen: return(DefaultPixelBlenders <TPixel> .ScreenDestOut.Instance);

                case PixelColorBlendingMode.Darken: return(DefaultPixelBlenders <TPixel> .DarkenDestOut.Instance);

                case PixelColorBlendingMode.Lighten: return(DefaultPixelBlenders <TPixel> .LightenDestOut.Instance);

                case PixelColorBlendingMode.Overlay: return(DefaultPixelBlenders <TPixel> .OverlayDestOut.Instance);

                case PixelColorBlendingMode.HardLight: return(DefaultPixelBlenders <TPixel> .HardLightDestOut.Instance);

                case PixelColorBlendingMode.Normal:
                default: return(DefaultPixelBlenders <TPixel> .NormalDestOut.Instance);
                }

            case PixelAlphaCompositionMode.DestOver:
                switch (colorMode)
                {
                case PixelColorBlendingMode.Multiply: return(DefaultPixelBlenders <TPixel> .MultiplyDestOver.Instance);

                case PixelColorBlendingMode.Add: return(DefaultPixelBlenders <TPixel> .AddDestOver.Instance);

                case PixelColorBlendingMode.Subtract: return(DefaultPixelBlenders <TPixel> .SubtractDestOver.Instance);

                case PixelColorBlendingMode.Screen: return(DefaultPixelBlenders <TPixel> .ScreenDestOver.Instance);

                case PixelColorBlendingMode.Darken: return(DefaultPixelBlenders <TPixel> .DarkenDestOver.Instance);

                case PixelColorBlendingMode.Lighten: return(DefaultPixelBlenders <TPixel> .LightenDestOver.Instance);

                case PixelColorBlendingMode.Overlay: return(DefaultPixelBlenders <TPixel> .OverlayDestOver.Instance);

                case PixelColorBlendingMode.HardLight: return(DefaultPixelBlenders <TPixel> .HardLightDestOver.Instance);

                case PixelColorBlendingMode.Normal:
                default: return(DefaultPixelBlenders <TPixel> .NormalDestOver.Instance);
                }

            case PixelAlphaCompositionMode.SrcOver:
            default:
                switch (colorMode)
                {
                case PixelColorBlendingMode.Multiply: return(DefaultPixelBlenders <TPixel> .MultiplySrcOver.Instance);

                case PixelColorBlendingMode.Add: return(DefaultPixelBlenders <TPixel> .AddSrcOver.Instance);

                case PixelColorBlendingMode.Subtract: return(DefaultPixelBlenders <TPixel> .SubtractSrcOver.Instance);

                case PixelColorBlendingMode.Screen: return(DefaultPixelBlenders <TPixel> .ScreenSrcOver.Instance);

                case PixelColorBlendingMode.Darken: return(DefaultPixelBlenders <TPixel> .DarkenSrcOver.Instance);

                case PixelColorBlendingMode.Lighten: return(DefaultPixelBlenders <TPixel> .LightenSrcOver.Instance);

                case PixelColorBlendingMode.Overlay: return(DefaultPixelBlenders <TPixel> .OverlaySrcOver.Instance);

                case PixelColorBlendingMode.HardLight: return(DefaultPixelBlenders <TPixel> .HardLightSrcOver.Instance);

                case PixelColorBlendingMode.Normal:
                default: return(DefaultPixelBlenders <TPixel> .NormalSrcOver.Instance);
                }
            }
        }