예제 #1
0
        /// <summary>
        /// Filter Implementation
        /// </summary>
        protected override IImageAdapter ProcessFilter(IImageAdapter source)
        {
            if (_redLuminance + _greenLuminance + _blueLuminance != 1.0)
            {
                throw new RenderingVerificationException("The sum of RedLuminance, GreenLuminance and BlueLuminance must be 1.0 (currently sum = " + (_redLuminance + _greenLuminance + _blueLuminance).ToString() + ")");
            }

            ImageAdapter retVal = new ImageAdapter(source.Width, source.Height);

            // Convert HSL to RGB
            HSLColor hsl = new HSLColor();

            hsl.H = ((Hue + 360.0) % 360) / 360.0;          // Normalize -180/180 to 0/1
            hsl.S = 1.0;
            hsl.L = 0.5;
            ColorSpaceConversion colorConvert = new ColorSpaceConversion();

            colorConvert.HSL = hsl;
            IColor tintColor = colorConvert.ColorDouble;

            // multiply every color channel by amount
            tintColor.ExtendedRed   *= Amount;
            tintColor.ExtendedGreen *= Amount;
            tintColor.ExtendedBlue  *= Amount;
            double amount = (Amount < 0) ? 1.0  : (1.0 - Amount);

            // Tint all pixels
            IColor newColor   = null;
            double luminance  = 0.0;
            int    height     = source.Height;
            int    width      = source.Width;
            double temp       = 0.0;
            double maxChannel = 0.0;
            int    x          = 0;
            int    y          = 0;

            for (y = 0; y < height; y++)
            {
                for (x = 0; x < width; x++)
                {
                    newColor = (IColor)source[x, y].Clone();
                    if (newColor.IsEmpty)
                    {
                        retVal[x, y] = newColor;
                        continue;
                    }
                    luminance  = newColor.ExtendedRed * _redLuminance + newColor.ExtendedGreen * _greenLuminance + newColor.ExtendedBlue * _blueLuminance;
                    maxChannel = Math.Max(Math.Max(source[x, y].ExtendedRed, source[x, y].ExtendedGreen), source[x, y].ExtendedBlue);

                    temp = source[x, y].ExtendedRed * amount + tintColor.ExtendedRed * maxChannel;
                    newColor.ExtendedRed = temp;

                    temp = source[x, y].ExtendedGreen * amount + tintColor.ExtendedGreen * maxChannel;
                    newColor.ExtendedGreen = temp;

                    temp = source[x, y].ExtendedBlue * amount + tintColor.ExtendedBlue * maxChannel;
                    newColor.ExtendedBlue = temp;

                    // restore the original luminance
                    double deltaLum = luminance - (newColor.ExtendedRed * _redLuminance + newColor.ExtendedGreen * _greenLuminance + newColor.ExtendedBlue * _blueLuminance);
                    newColor.ExtendedRed   = newColor.ExtendedRed + deltaLum;
                    newColor.ExtendedGreen = newColor.ExtendedGreen + deltaLum;
                    newColor.ExtendedBlue  = newColor.ExtendedBlue + deltaLum;
                    retVal[x, y]           = newColor;
                }
            }
            return(retVal);
        }
예제 #2
0
        /// <summary>
        /// Filter Implementation
        /// </summary>
        protected override IImageAdapter ProcessFilter(IImageAdapter source)
        {
            ImageAdapter retVal = new ImageAdapter(source.Width, source.Height);

            // Convert HSL to RGB
            HSLColor hsl = new HSLColor();

            hsl.H = ((Hue + 360.0) % 360) / 360.0;          // Normalize -180/180 to 0/1
            hsl.S = 1.0;
            hsl.L = 0.5;
            ColorSpaceConversion colorConvert = new ColorSpaceConversion();

            colorConvert.HSL = hsl;
            IColor tintColor = colorConvert.ColorDouble;
            // multiply every color channel by amount
            double amount = Amount;

            tintColor.ExtendedRed   *= Amount;
            tintColor.ExtendedGreen *= Amount;
            tintColor.ExtendedBlue  *= Amount;
            if (Amount < 0.0)
            {
                amount *= -1;
                tintColor.ExtendedRed   = 1.0 + tintColor.ExtendedRed;
                tintColor.ExtendedGreen = 1.0 + tintColor.ExtendedGreen;
                tintColor.ExtendedBlue  = 1.0 + tintColor.ExtendedBlue;
            }

            // Tint all pixels
            IColor newColor   = null;
            IColor tempColor  = null;
            double luminance  = 0.0;
            int    height     = source.Height;
            int    width      = source.Width;
            double temp       = 0.0;
            double maxChannel = 0.0;
            int    x          = 0;
            int    y          = 0;

            for (y = 0; y < height; y++)
            {
                for (x = 0; x < width; x++)
                {
                    tempColor = new ColorDouble((IColor)source[x, y]);
                    if (tempColor.IsEmpty)
                    {
                        retVal[x, y] = tempColor;
                        continue;
                    }
                    luminance  = tempColor.ExtendedRed * MIL_LUMINANCE_RED + tempColor.ExtendedGreen * MIL_LUMINANCE_GREEN + tempColor.ExtendedBlue * MIL_LUMINANCE_BLUE;
                    maxChannel = Math.Max(Math.Max(source[x, y].ExtendedRed, source[x, y].ExtendedGreen), source[x, y].ExtendedBlue);

                    temp = source[x, y].ExtendedRed * (1.0 - amount) + tintColor.ExtendedRed * maxChannel;
                    tempColor.ExtendedRed = temp;
                    temp = source[x, y].ExtendedGreen * (1.0 - amount) + tintColor.ExtendedGreen * maxChannel;
                    tempColor.ExtendedGreen = temp;
                    temp = source[x, y].ExtendedBlue * (1.0 - amount) + tintColor.ExtendedBlue * maxChannel;
                    tempColor.ExtendedBlue = temp;

                    // restore the original luminance
                    double deltaLum = luminance - (tempColor.ExtendedRed * MIL_LUMINANCE_RED + tempColor.ExtendedGreen * MIL_LUMINANCE_GREEN + tempColor.ExtendedBlue * MIL_LUMINANCE_BLUE);

                    newColor               = (IColor)source[x, y].Clone();
                    newColor.ExtendedRed   = tempColor.ExtendedRed + deltaLum;
                    newColor.ExtendedGreen = tempColor.ExtendedGreen + deltaLum;
                    newColor.ExtendedBlue  = tempColor.ExtendedBlue + deltaLum;
                    retVal[x, y]           = newColor;
                }
            }
            return(retVal);
        }