Re: color balance (preserve luminosity) bug

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



I'm not working on directly with the Gimp source, but I did fix the
bug with Preserve Luminosity. The offending code in color-balance.c
lines 182-187:

	  if (cb->preserve_luminosity)
	    {
	      gimp_rgb_to_hsl_int (&r_n, &g_n, &b_n);
	      b_n = gimp_rgb_to_l_int (r, g, b);
	      gimp_hsl_to_rgb_int (&r_n, &g_n, &b_n);
	    }

I'm working in Objective-C, so my code isn't copy paste ready.
Basically, if cb-> preserve_luminosity, re-scale the slider values so
that the lightness of R1+G1+B1 = the lightness of the base pixel
R+G+B, now use these modified slider values when changing the pixel
values:

-(NSBitmapImageRep *)colorAdjustedImage:(NSBitmapImageRep *)baseImageRep
					  preserveLumenance:(BOOL)preserveLumenance
							  colorTone:(LSColorTone)colorTone
{
    int w,h,x,y = 0;
    unsigned char *srcData, *p1;
    int n, red, green, blue;
	double shadowScale, midScale, highlightScale;

	shadowScale = midScale = highlightScale = 1.0;
	
	if (preserveLumenance == YES) {
		shadowScale =    1.0 / ( ([_shadowToneRed doubleValue] / 100.0) +
([_shadowToneGreen doubleValue] / 100.0) + ([_shadowToneBlue
doubleValue] / 100.0) );
		midScale =       1.0 / ( (   [_midToneRed doubleValue] / 100.0) + ( 
 [_midToneGreen doubleValue] / 100.0) + (   [_midToneBlue doubleValue]
/ 100.0) );
		highlightScale = 1.0 / ( (  [_highToneRed doubleValue] / 100.0) + ( 
[_highToneGreen doubleValue] / 100.0) + (  [_highToneBlue doubleValue]
/ 100.0) );
		
		shadowScale = shadowScale < -1/3 ? -1/3 : shadowScale;
		shadowScale = shadowScale > 1/3 ? 1/3 : shadowScale;
		shadowScale = shadowScale == 0 ? 1.0 : shadowScale;

		midScale = midScale < -1/3 ? -1/3 : midScale;
		midScale = midScale > 1/3 ? 1/3 : midScale;
		midScale = midScale == 0 ? 1.0 : midScale;

		highlightScale = highlightScale < -1/3 ? -1/3 : highlightScale;
		highlightScale = highlightScale > 1/3 ? 1/3 : highlightScale;
		highlightScale = highlightScale == 0 ? 1.0 : highlightScale;
	}
	
    // update the tonal range values from any changes in the UI
    [self applyToneToColorAdjustment:colorToneMatrix];

    // now set the slider values for the different tonal ranges
    cyan_red[LSColorToneShadow]      = shadowScale * [_shadowToneRed
doubleValue];
    magenta_green[LSColorToneShadow] = shadowScale * [_shadowToneGreen
doubleValue];
    yellow_blue[LSColorToneShadow]   = shadowScale * [_shadowToneBlue
doubleValue];

    cyan_red[LSColorToneMidtone]      = midScale * [_midToneRed doubleValue];
    magenta_green[LSColorToneMidtone] = midScale * [_midToneGreen doubleValue];
    yellow_blue[LSColorToneMidtone]   = midScale * [_midToneBlue doubleValue];

    cyan_red[LSColorToneHighlights]      = highlightScale *
[_highToneRed doubleValue];
    magenta_green[LSColorToneHighlights] = highlightScale *
[_highToneGreen doubleValue];
    yellow_blue[LSColorToneHighlights]   = highlightScale *
[_highToneBlue doubleValue];


    // create the color lookup tables for the current slider values
and tonal ranges
    [self color_balance_create_lookup_tables];

    // change the pixels
    w = [baseImageRep pixelsWide];
    h = [baseImageRep pixelsHigh];

    srcData = [baseImageRep bitmapData];
    n = [baseImageRep bitsPerPixel] / 8;

    for ( y = 0 ; y < h ; y++) {
        for ( x = 0 ; x < w ; x++) {
            int r, g, b = 0;
            p1 = srcData + n * (y * w + x);

            // get the pixels color components
            r = p1[0];
            g = p1[1];
            b = p1[2];

            // lookup the new color values in the LUTS contructed from
slider values and tonal selections
            red = r_lookup[r];
            green = g_lookup[g];
            blue = b_lookup[b];

            // preserve lumenance if requested to do so
			// original code from adapted from the Gimp, which does not work correctly.
//            if (preserveLumenance == YES) {
//                gimp_rgb_to_hsl_int (&red, &green, &blue); // red
becomes hue, green becomes saturation, blue becomes lightness
//                blue = gimp_rgb_to_l_int (r, g, b); // get the
lightness, set it
//                gimp_hsl_to_rgb_int (&red, &green, &blue);
//            }

            // stomp the pixel component values
            p1[0] = red;
            p1[1] = green;
            p1[2] = blue;
        }
    }

    return baseImageRep;
}
_______________________________________________
Gimp-developer mailing list
Gimp-developer@xxxxxxxxxxxxxxxxxxxxxx
https://lists.XCF.Berkeley.EDU/mailman/listinfo/gimp-developer

[Index of Archives]     [Video For Linux]     [Photo]     [Yosemite News]     [gtk]     [GIMP for Windows]     [KDE]     [GEGL]     [Gimp's Home]     [Gimp on GUI]     [Gimp on Windows]     [Steve's Art]

  Powered by Linux