Page 1 of 1

How rgbToHsl really works ?

Posted: July 1st, 2014, 7:22 am
by mienda
Hi I spent lot of time to get luma value from a rgb color.
I get my reference value for HSL in the info panel, I just have to put the mouse on the right color.
for example:
if the rgb color is a gray at 30% (0.3020 , 0.3020 , 0.3020) in decimal.
the results of this expression is:
rgbToHsl(0.3020 , 0.3020 , 0.3020)[2] = 30 (it's ok)
But it doesn't work for this pure red color (1,0,0) luma should be at 100%.
rgbToHsl(1 , 0 , 0)[2] = 50
same for this
rgbToHsl(0 , 0.75 , 0)[2] = 37 (should be 75%)

So I tried an other way:
Math.round ((Math.max(rgb[0],rgb[1],rgb[2]) + Math.min(rgb[0],rgb[1],rgb[2]) /2)*100)

This time a get the right luma value if I choose a color sample but a wrong result for a grayscale sample !

What do you think ?
I want the expression on a text layer to make a kind of color picker to show only the luma. It's quite simple but I want it reliable.

Re: How rgbToHsl really works ?

Posted: July 1st, 2014, 7:11 pm
by Dan Ebberts
I think the luma/lightness channel is defined to be the average of the largest and smallest color channels. So pure red, blue or green would be 0.5 and white would be 1.0, etc.


Re: How rgbToHsl really works ?

Posted: July 2nd, 2014, 3:31 am
by mienda
Hi Dan,
thanks for your reply.
You right, so I tried an other operation.
This one is ok only for a pure red sample: L0= Math.round ( (Math.max(rgb[0],rgb[1],rgb[2]) + Math.min(rgb[0],rgb[1],rgb[2]) /2)*100) And these one give me the same good result but only on a grayscale sample! L1= Math.round(50*(Math.max(rgb[0],rgb[1],rgb[2]) + Math.min(rgb[0],rgb[1],rgb[2])))
L2= Math.round((hsla[2])*100); Obviously I missed something, Do you think I have to write a condition ? (if a RGB channel = 0 for ex)
Or the problem is in the operation to get the average between channel max and channel mini.

Thank's again.

Re: How rgbToHsl really works ?

Posted: July 2nd, 2014, 9:27 am
by Dan Ebberts
I'm not sure exactly what you're after, but I ran a quick test, and this slider expression always gives me 0.00 no matter what color I choose for the Fill effect:

c = effect("Fill")("Color");
L1 = rgbToHsl(c)[2];
L2 = (Math.max(c[0],c[1],c[2]) + Math.min(c[0],c[1],c[2]))/2

L2 - L1

What version of AE are you using? As I recall, Math.min() and Math.max() didn't use to work correctly with more than two arguments.


Re: How rgbToHsl really works ?

Posted: July 3rd, 2014, 1:44 am
by mienda
Hi Dan,
I think it works now.
You can find below the project, I use AE cs6 (in french) but I think it's ok for the expressions.

I use a lot the color picker for color grading cell Animation to match perfectly with the backgrounds.
And often everything is pre-composed so to have an "external" color picker is very useful.

Thank's again