public static void then_should_return_true_given_new_objects()
            {
                // Arrange
                var imageLayer1 = new ImageLayer();
                var imageLayer2 = new ImageLayer();

                // Act
                var result = imageLayer1.Equals(imageLayer2);

                // Assert
                Assert.That(result, Is.True);
            }
            public static void then_should_return_false_given_null_second_layer()
            {
                // Arrange
                var imageLayer1 = new ImageLayer { Position = new Point(1, 1) };
                ImageLayer imageLayer2 = null;

                // Act
                var result = imageLayer1.Equals(imageLayer2);

                // Assert
                Assert.That(result, Is.False);
            }
            public static void then_should_return_false_given_different_layers()
            {
                // Arrange
                var imageLayer1 = new ImageLayer { Position = new Point(1, 1) };
                var imageLayer2 = new ImageLayer { Position = new Point(10, 10) };

                // Act
                var result = imageLayer1.Equals(imageLayer2);

                // Assert
                Assert.That(result, Is.False);
            }
            public static void then_should_return_true_given_image_and_size_and_opacity_and_position_same()
            {
                // Arrange
                var imageLayer1 = new ImageLayer
                {
                    Opacity = 50,
                    Position = new Point(1, 1),
                    Size = new Size(5, 5)
                };
                var imageLayer2 = new ImageLayer
                {
                    Opacity = 50,
                    Position = new Point(1, 1),
                    Size = new Size(5, 5)
                };

                // Act
                var result = imageLayer1.Equals(imageLayer2);

                // Assert
                Assert.That(result, Is.True);
            }
        /// <summary>
        /// Adds a image overlay to the current image.
        /// </summary>
        /// <param name="imageLayer">
        /// The <see cref="T:ImageProcessor.Imaging.ImageLayer"/> containing the properties necessary to add 
        /// the image overlay to the image.
        /// </param>
        /// <returns>
        /// The current instance of the <see cref="T:ImageProcessor.ImageFactory"/> class.
        /// </returns>
        public ImageFactory Overlay(ImageLayer imageLayer)
        {
            if (this.ShouldProcess)
            {
                Overlay watermark = new Overlay { DynamicParameter = imageLayer };
                this.CurrentImageFormat.ApplyProcessor(watermark.ProcessImage, this);
            }

            return this;
        }
        static byte[] Overlay(byte[] photo, Image overlay, int offset, int quality = 100, int opacity = 100)
        {
            var position = new Point();
            using (var ms = new MemoryStream(photo))
            {
                var image = Image.FromStream(ms);
                position.X = image.Width - overlay.Width - offset;
                position.Y = image.Height - overlay.Height - offset;
            }

            var imagelayer = new ImageLayer
            {
                Image = overlay,
                Position = position,
                Opacity = opacity
            };

            using (var inStream = new MemoryStream(photo))
            {
                using (var outStream = new MemoryStream())
                {
                    using (var imageFactory = new ImageFactory(preserveExifData: true))
                    {
                        imageFactory.Load(inStream)
                            .Overlay(imagelayer)
                            .Format(new JpegFormat())
                            .Quality(quality)
                            .BackgroundColor(Color.White)
                            .Save(outStream);

                        return outStream.ToArray();
                    }
                }
            }
        }