static Image AddWatermark(this Image image)
        {
            if (Watermark.Image == null || image == null)
            {
                throw new ArgumentException();
            }
            var imageResolution = image.GetResolution();
            var resultBitmap    = new Bitmap((int)imageResolution.Width, (int)imageResolution.Height);

            try
            {
                resultBitmap.SetResolution(image.HorizontalResolution, image.VerticalResolution);
                Image watermarkImageCopy = null;
                lock (Watermark) { watermarkImageCopy = (Image)Watermark.Image.Clone(); }
                using (var graphicCanvas = Graphics.FromImage(resultBitmap))
                {
                    graphicCanvas.CompositingQuality = CompositingQuality.HighQuality;
                    graphicCanvas.InterpolationMode  = InterpolationMode.HighQualityBicubic;
                    graphicCanvas.SmoothingMode      = SmoothingMode.HighQuality;

                    var watermarkOrginalSize        = new RectangleF(0, 0, watermarkImageCopy.Width, watermarkImageCopy.Height);
                    var watermarkComputedResolution = Watermark.Scale.GetComputedResolution(imageResolution, watermarkImageCopy.GetResolution());
                    var waterwarkComputedMargin     = Watermark.Margin.GetComputedMargin(imageResolution);
                    var watermarkComputedPosition   = Watermark.GetWatermarkPosition(imageResolution, watermarkComputedResolution, waterwarkComputedMargin);
                    var watermarkColorMatrix        = new ColorMatrix();
                    watermarkColorMatrix.Matrix33 = Watermark.Opacity;
                    var watermarkImageAttributes = new ImageAttributes();
                    watermarkImageAttributes.SetColorMatrix(watermarkColorMatrix);

                    graphicCanvas.DrawImage(image, 0, 0, imageResolution.Width, imageResolution.Height);
                    graphicCanvas.DrawImage(watermarkImageCopy, watermarkComputedPosition.GetArray(), watermarkOrginalSize, GraphicsUnit.Pixel, watermarkImageAttributes);
                }
                watermarkImageCopy.Dispose();
                return(resultBitmap);
            }
            catch
            {
                resultBitmap.Dispose();
                throw new ArgumentException();
            }
        }