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