public static Image DrawOn(string imagePath, WatermarkerConfig config)
        {
            var image         = Image.FromFile(imagePath);
            var watermarkPath = $@"{Directory.GetCurrentDirectory()}\Images\watermark.png";
            var watermark     = Properties.Resources.watermark;

            //var watermark = Image.FromFile(watermarkPath);

            if (!config.Margin.AllEqual(0) || config.ScaleRatio != 1.0f)
            {
                watermark = RedrawWatermarkWithMargins(watermark, config.Margin, config.ScaleRatio);
            }

            if (image == null)
            {
                throw new NullReferenceException("Image to draw on cannot be null.");
            }
            if (watermark == null)
            {
                throw new NullReferenceException("Watermark cannot be null.");
            }

            if (config.Opacity < 0 || config.Opacity > 1)
            {
                throw new ArgumentOutOfRangeException("Opacity");
            }

            if (config.ScaleRatio <= 0)
            {
                throw new ArgumentOutOfRangeException("ScaleRatio");
            }

            watermark.RotateFlip(config.RotateFlip);

            var watermarkPosition = image.GetWatermarkPosition(watermark, config);
            var destRect          = new Rectangle(watermarkPosition.X, watermarkPosition.Y, watermark.Width, watermark.Height);
            var colorMatrix       = new ColorMatrix();

            colorMatrix.Matrix33 = config.Opacity;
            var imageAttributes = new ImageAttributes();

            imageAttributes.SetColorMatrix(colorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);

            if (config.TransparentColor != Color.Empty)
            {
                imageAttributes.SetColorKey(config.TransparentColor, config.TransparentColor);
            }

            using (var graphics = Graphics.FromImage(image))
            {
                graphics.DrawImage(watermark, destRect, 0, 0, watermark.Width, watermark.Height, GraphicsUnit.Pixel, imageAttributes);
            }

            return(image);
        }
        private static System.Drawing.Point GetWatermarkPosition(this Image image, Bitmap watermark, WatermarkerConfig config)
        {
            int x = 0;
            int y = 0;

            switch (config.Position)
            {
            case WatermarkPosition.Absolute:
                x = config.PositionX; y = config.PositionY;
                break;

            case WatermarkPosition.TopLeft:
                x = 0; y = 0;
                break;

            case WatermarkPosition.TopRight:
                x = image.Width - watermark.Width; y = 0;
                break;

            case WatermarkPosition.TopMiddle:
                x = (image.Width - watermark.Width) / 2; y = 0;
                break;

            case WatermarkPosition.BottomLeft:
                x = 0; y = image.Height - watermark.Height;
                break;

            case WatermarkPosition.BottomRight:
                x = image.Width - watermark.Width; y = image.Height - watermark.Height;
                break;

            case WatermarkPosition.BottomMiddle:
                x = (image.Width - watermark.Width) / 2; y = image.Height - watermark.Height;
                break;

            case WatermarkPosition.MiddleLeft:
                x = 0; y = (image.Height - watermark.Height) / 2;
                break;

            case WatermarkPosition.MiddleRight:
                x = image.Width - watermark.Width; y = (image.Height - watermark.Height) / 2;
                break;

            case WatermarkPosition.Center:
                x = (image.Width - watermark.Width) / 2; y = (image.Height - watermark.Height) / 2;
                break;

            default:
                break;
            }

            return(new System.Drawing.Point(x, y));
        }