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(); } }