RGB to HSL conversion

stw2011's icon

Hi,

Can anyone help me with this? I am looking to convert RGB values that will be typed in the Messages boxes to HSL values for the Color Swatch. I am looking to convert these values within my patch, I have tried some externals but I could not get them to work, like Jasch RGBtoHSL external.

Can someone help me with this?

Thank you in advanec

Christopher Dobrian's icon
Max Patch
Copy patch and select New From Clipboard in Max.

The swatch objects expects RGB values by default. There's no need to convert to HSL (unless I'm completely misunderstanding what you mean). If you're just trying to convert a triad of RGB values to a triad of HSL values, see http://www.rapidtables.com/convert/color/rgb-to-hsl.htm. Or you can let Jitter do it for you.

stw2011's icon

Thank you so much for your help, Chris. This worked perfectly.

metamax's icon

Keep in mind that jit.rgb2hsl processes 360 degrees of hue with only 8-bits of depth (255). That means that there can be as much as a degree and a half of error throughout the hue values.. which can be very noticeable when compared to accurate hue.

Max Patch
Copy patch and select New From Clipboard in Max.

For the fastest and most accurate conversion, use the rgb2hsl gen object inside of jit.pix.

Roman Thilenius's icon

it is tempting to post an expr solution now, but unfortunately there is some dumb bug in this patch. ^^

hsl.jpg
jpg
madbutter's icon

I needed to do a simple conversion from an RGB color to HSL values (and back again) in part of some javascript code and found this somewhere on the web, which works nicely. The other solutions look more efficient, but maybe if you are in the same boat I was and didn't want to leave javascript for the conversion:

//colorspace conversions
function rgbToHsl(r, g, b){
    r /= 255, g /= 255, b /= 255;
    var max = Math.max(r, g, b), min = Math.min(r, g, b);
    var h, s, l = (max + min) / 2;

    if(max == min){
        h = s = 0; // achromatic
    }else{
        var d = max - min;
        s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
        switch(max){
            case r: h = (g - b) / d + (g < b ? 6 : 0); break;
            case g: h = (b - r) / d + 2; break;
            case b: h = (r - g) / d + 4; break;
        }
        h /= 6;
    }
    //post("rgbC:", [h,s,l], "\n");
    return [h, s, l];
}
function hslToRgb(h, s, l){
    var r, g, b;

    if(s == 0){
        r = g = b = l; // achromatic
    }else{
        function hue2rgb(p, q, t){
            if(t < 0) t += 1;
            if(t > 1) t -= 1;
            if(t < 1/6) return p + (q - p) * 6 * t;
            if(t < 1/2) return q;
            if(t < 2/3) return p + (q - p) * (2/3 - t) * 6;
            return p;
        }

        var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
        var p = 2 * l - q;
        r = hue2rgb(p, q, h + 1/3);
        g = hue2rgb(p, q, h);
        b = hue2rgb(p, q, h - 1/3);
    }
    r = Math.round(r*255);
    g = Math.round(g*255);
    b = Math.round(b*255);
    //post("hslC:", [r,g,b], "\n");
    return [r, g, b];
}