diff --git a/GreenshotPlugin/Core/Effects.cs b/GreenshotPlugin/Core/Effects.cs index dcbaf9ff0..9f0224b03 100644 --- a/GreenshotPlugin/Core/Effects.cs +++ b/GreenshotPlugin/Core/Effects.cs @@ -111,6 +111,33 @@ namespace Greenshot.Core { } } + /// + /// AdjustEffect + /// + public class AdjustEffect : IEffect { + public AdjustEffect() : base() { + Contrast = 1f; + Brightness = 1f; + Gamma = 1f; + } + public float Contrast { + get; + set; + } + public float Brightness { + get; + set; + } + public float Gamma { + get; + set; + } + public Image Apply(Image sourceImage, out Point offsetChange) { + offsetChange = Point.Empty; + return ImageHelper.Adjust(sourceImage, Brightness, Contrast, Gamma); + } + } + /// /// InvertEffect /// diff --git a/GreenshotPlugin/Core/ImageHelper.cs b/GreenshotPlugin/Core/ImageHelper.cs index 0ac5739c5..033517b8f 100644 --- a/GreenshotPlugin/Core/ImageHelper.cs +++ b/GreenshotPlugin/Core/ImageHelper.cs @@ -1029,6 +1029,42 @@ namespace GreenshotPlugin.Core { return newImage; } + /// + /// Adjust the brightness, contract or gamma of an image. + /// Use the value "1.0f" for no changes. + /// + /// Original bitmap + /// Bitmap with grayscale + public static Image Adjust(Image sourceImage, float brightness, float contrast, float gamma) { + //create a blank bitmap the same size as original + // If using 8bpp than the following exception comes: A Graphics object cannot be created from an image that has an indexed pixel format. + Bitmap newBitmap = CreateEmpty(sourceImage.Width, sourceImage.Height, PixelFormat.Format24bppRgb, Color.Empty, sourceImage.HorizontalResolution, sourceImage.VerticalResolution); + float adjustedBrightness = brightness - 1.0f; + // get a graphics object from the new image + using (Graphics graphics = Graphics.FromImage(newBitmap)) { + // create the grayscale ColorMatrix + ColorMatrix colorMatrix = new ColorMatrix( + new float[][] { + new float[] {contrast, 0, 0, 0, 0}, // scale red + new float[] {0, contrast, 0, 0, 0}, // scale green + new float[] {0, 0, contrast, 0, 0}, // scale blue + new float[] {0, 0, 0, 1.0f, 0}, // don't scale alpha + new float[] {adjustedBrightness, adjustedBrightness, adjustedBrightness, 0, 1} + }); + + //create some image attributes + ImageAttributes attributes = new ImageAttributes(); + + //set the color matrix attribute + attributes.SetColorMatrix(colorMatrix); + + //draw the original image on the new image using the grayscale color matrix + graphics.DrawImage(sourceImage, new Rectangle(0, 0, sourceImage.Width, sourceImage.Height), 0, 0, sourceImage.Width, sourceImage.Height, GraphicsUnit.Pixel, attributes); + } + + return newBitmap; + } + /// /// Create a new bitmap where the sourceBitmap is in grayscale ///