Marqué comme hors sujet malgré la demande d'un algorithme, qui est explicitement un `` sujet '' sur stackoverflow.com/help/on-topic - qu'est-ce que cela donne?
LeeGee
2
C'est le pire vote de clôture que j'ai jamais vu sur ce site, et cela en dit long! Je suis le premier vote à rouvrir.
/**
* Converts an HSL color value to RGB. Conversion formula
* adapted from http://en.wikipedia.org/wiki/HSL_color_space.
* Assumes h, s, and l are contained in the set [0, 1] and
* returns r, g, and b in the set [0, 255].
*
* @param {number} h The hue
* @param {number} s The saturation
* @param {number} l The lightness
* @return {Array} The RGB representation
*/function hslToRgb(h, s, l){var r, g, b;if(s ==0){
r = g = b = l;// achromatic}else{var hue2rgb =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);}return[Math.round(r *255),Math.round(g *255),Math.round(b *255)];}
RVB à HSL:
/**
* Converts an RGB color value to HSL. Conversion formula
* adapted from http://en.wikipedia.org/wiki/HSL_color_space.
* Assumes r, g, and b are contained in the set [0, 255] and
* returns h, s, and l in the set [0, 1].
*
* @param {number} r The red color value
* @param {number} g The green color value
* @param {number} b The blue color value
* @return {Array} The HSL representation
*/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;}return[h, s, l];}
J'adore la façon dont les commentaires me disent la plage des variables et à quoi s'attendre en sortie. Tellement bien rangé. Merci!
Gleno
9
J'essaye de l'utiliser pour un projet, mais mes résultats ne sortent qu'en niveaux de gris. Est-ce une limitation de HSL <-> RVB? L'article de wikipedia semble suggérer qu'une seule valeur est définie pour les 3 canaux.
Projet de loi du
10
Je tiens à souligner que l'utilisation Math.roundintroduit de petites inexactitudes aux extrémités inférieure et supérieure (valeurs de 0 et 255) de l'échelle. Les valeurs qui ne se trouvent pas aux extrémités de la plage peuvent être arrondies vers le haut ou vers le bas pour atteindre leur valeur, mais les valeurs ne peuvent être arrondies qu'à 0 ou à 255. Cela signifie que la plage de valeurs qui correspond à 0 et 255 est exactement la moitié de ceux pour les autres valeurs. Pour résoudre ce problème, utilisez cette formule à la place: min(floor(val*256),255). Cela rend la cartographie presque parfaite.
marcus erronius
13
De plus, si vous obtenez des valeurs en niveaux de gris, c'est probablement à cause des lignes qui utilisent h + 1/3et h - 1/3. Dans de nombreuses langues, cela utilise la division entière, où 1/3vaut zéro. pour obtenir des résultats corrects, en flottant littéraux au lieu, par exemple .: h + 1.0/3.0.
Je ne peux pas croire qu'il existe un tel module standard en Python! Cela me sauve vraiment. J'ai eu du mal avec l'algorithme de conversion dans l'entrée HSL de Wikipedia pendant 2 heures. Il semble que l'algorithme ne peut pas obtenir la bonne sortie.
J'utilise brython pour obtenir un sélecteur de couleurs dans le navigateur, c'est exactement ce dont j'avais besoin!
EvertW
23
Implémentation Java du code de Mohsen
Notez que tous les entiers sont déclarés comme float (ie 1f) et doivent être float, sinon vous opterez pour les couleurs grises.
HSL à RVB
/**
* Converts an HSL color value to RGB. Conversion formula
* adapted from http://en.wikipedia.org/wiki/HSL_color_space.
* Assumes h, s, and l are contained in the set [0, 1] and
* returns r, g, and b in the set [0, 255].
*
* @param h The hue
* @param s The saturation
* @param l The lightness
* @return int array, the RGB representation
*/publicstaticint[] hslToRgb(float h,float s,float l){float r, g, b;if(s ==0f){
r = g = b = l;// achromatic}else{float q = l <0.5f? l *(1+ s): l + s - l * s;float p =2* l - q;
r = hueToRgb(p, q, h +1f/3f);
g = hueToRgb(p, q, h);
b = hueToRgb(p, q, h -1f/3f);}int[] rgb ={to255(r), to255(g), to255(b)};return rgb;}publicstaticint to255(float v){return(int)Math.min(255,256*v);}/** Helper method that converts hue to rgb */publicstaticfloat hueToRgb(float p,float q,float t){if(t <0f)
t +=1f;if(t >1f)
t -=1f;if(t <1f/6f)return p +(q - p)*6f* t;if(t <1f/2f)return q;if(t <2f/3f)return p +(q - p)*(2f/3f- t)*6f;return p;}
RVB à HSL
/**
* Converts an RGB color value to HSL. Conversion formula
* adapted from http://en.wikipedia.org/wiki/HSL_color_space.
* Assumes pR, pG, and bpBare contained in the set [0, 255] and
* returns h, s, and l in the set [0, 1].
*
* @param pR The red color value
* @param pG The green color value
* @param pB The blue color value
* @return float array, the HSL representation
*/publicstaticfloat[] rgbToHsl(int pR,int pG,int pB){float r = pR /255f;float g = pG /255f;float b = pB /255f;float max =(r > g && r > b)? r :(g > b)? g : b;float min =(r < g && r < b)? r :(g < b)? g : b;float h, s, l;
l =(max + min)/2.0f;if(max == min){
h = s =0.0f;}else{float d = max - min;
s =(l >0.5f)? d /(2.0f- max - min): d /(max + min);if(r > g && r > b)
h =(g - b)/ d +(g < b ?6.0f:0.0f);elseif(g > b)
h =(b - r)/ d +2.0f;else
h =(r - g)/ d +4.0f;
h /=6.0f;}float[] hsl ={h, s, l};return hsl;}
Si vous recherchez quelque chose qui est définitivement conforme à la sémantique CSS pour HSL et RGB, vous pouvez utiliser l'algorithme spécifié dans la spécification CSS 3 , qui se lit comme suit:
HOW TO RETURN hsl.to.rgb(h, s, l):
SELECT:
l<=0.5: PUT l*(s+1) IN m2
ELSE: PUT l+s-l*s IN m2
PUT l*2-m2 IN m1
PUT hue.to.rgb(m1, m2, h+1/3) IN r
PUT hue.to.rgb(m1, m2, h ) IN g
PUT hue.to.rgb(m1, m2, h-1/3) IN b
RETURN (r, g, b)
HOW TO RETURN hue.to.rgb(m1, m2, h):
IF h<0: PUT h+1 IN h
IF h>1: PUT h-1 IN h
IF h*6<1: RETURN m1+(m2-m1)*h*6
IF h*2<1: RETURN m2
IF h*3<2: RETURN m1+(m2-m1)*(2/3-h)*6
RETURN m1
Je crois que c'est la source de certaines des autres réponses ici.
Voici le code de la réponse de Mohsen en C # si quelqu'un d'autre le souhaite. Remarque: Colorest une classe personnalisée et Vector4provient d'OpenTK. Les deux sont faciles à remplacer par autre chose de votre choix.
Hsl à Rgba
/// <summary>/// Converts an HSL color value to RGB./// Input: Vector4 ( X: [0.0, 1.0], Y: [0.0, 1.0], Z: [0.0, 1.0], W: [0.0, 1.0] )/// Output: Color ( R: [0, 255], G: [0, 255], B: [0, 255], A: [0, 255] )/// </summary>/// <param name="hsl">Vector4 defining X = h, Y = s, Z = l, W = a. Ranges [0, 1.0]</param>/// <returns>RGBA Color. Ranges [0, 255]</returns>publicstaticColorHslToRgba(Vector4 hsl){float r, g, b;if(hsl.Y ==0.0f)
r = g = b = hsl.Z;else{var q = hsl.Z <0.5f? hsl.Z *(1.0f+ hsl.Y): hsl.Z + hsl.Y - hsl.Z * hsl.Y;var p =2.0f* hsl.Z - q;
r =HueToRgb(p, q, hsl.X +1.0f/3.0f);
g =HueToRgb(p, q, hsl.X);
b =HueToRgb(p, q, hsl.X -1.0f/3.0f);}returnnewColor((int)(r *255),(int)(g *255),(int)(b *255),(int)(hsl.W *255));}// Helper for HslToRgbaprivatestaticfloatHueToRgb(float p,float q,float t){if(t <0.0f) t +=1.0f;if(t >1.0f) t -=1.0f;if(t <1.0f/6.0f)return p +(q - p)*6.0f* t;if(t <1.0f/2.0f)return q;if(t <2.0f/3.0f)return p +(q - p)*(2.0f/3.0f- t)*6.0f;return p;}
Rgba à Hsl
/// <summary>/// Converts an RGB color value to HSL./// Input: Color ( R: [0, 255], G: [0, 255], B: [0, 255], A: [0, 255] )/// Output: Vector4 ( X: [0.0, 1.0], Y: [0.0, 1.0], Z: [0.0, 1.0], W: [0.0, 1.0] )/// </summary>/// <param name="rgba"></param>/// <returns></returns>publicstaticVector4RgbaToHsl(Color rgba){float r = rgba.R /255.0f;float g = rgba.G /255.0f;float b = rgba.B /255.0f;float max =(r > g && r > b)? r :(g > b)? g : b;float min =(r < g && r < b)? r :(g < b)? g : b;float h, s, l;
h = s = l =(max + min)/2.0f;if(max == min)
h = s =0.0f;else{float d = max - min;
s =(l >0.5f)? d /(2.0f- max - min): d /(max + min);if(r > g && r > b)
h =(g - b)/ d +(g < b ?6.0f:0.0f);elseif(g > b)
h =(b - r)/ d +2.0f;else
h =(r - g)/ d +4.0f;
h /=6.0f;}returnnewVector4(h, s, l, rgba.A /255.0f);}
Entrée: couleur hexadécimale au format: [#] 0f4 ou [#] 00ff44 (signe dièse facultatif)
Sortie: TSL en degrés, pourcentage, pourcentage
/**
* Input: hex color
* Output: hsl(in ranges from 0-1)
*
* Takes the hex, converts it to RGB, and sends
* it to RGBToHsl. Returns the output.
*
*/function hexToHsl($hex){
$r ="";
$g ="";
$b ="";
$hex = str_replace('#','', $hex);if(strlen($hex)==3){
$r = substr($hex,0,1);
$r = $r . $r;
$g = substr($hex,1,1);
$g = $g . $g;
$b = substr($hex,2,1);
$b = $b . $b;} elseif (strlen($hex)==6){
$r = substr($hex,0,2);
$g = substr($hex,2,2);
$b = substr($hex,4,2);}else{returnfalse;}
$r = hexdec($r);
$g = hexdec($g);
$b = hexdec($b);
$hsl = rgbToHsl($r,$g,$b);return $hsl;}
RVB à HSL
Entrée: RVB dans la plage 0-255 Sortie: TSL en degrés, pourcentage, pourcentage.
/**
*
*Credits:
* /programming/4793729/rgb-to-hsl-and-back-calculation-problems
* http://www.niwa.nu/2013/05/math-behind-colorspace-conversions-rgb-hsl/
*
* Called by hexToHsl by default.
*
* Converts an RGB color value to HSL. Conversion formula
* adapted from http://www.niwa.nu/2013/05/math-behind-colorspace-conversions-rgb-hsl/.
* Assumes r, g, and b are contained in the range [0 - 255] and
* returns h, s, and l in the format Degrees, Percent, Percent.
*
* @param Number r The red color value
* @param Number g The green color value
* @param Number b The blue color value
* @return Array The HSL representation
*/function rgbToHsl($r, $g, $b){//For the calculation, rgb needs to be in the range from 0 to 1. To convert, divide by 255 (ff).
$r /=255;
$g /=255;
$b /=255;
$myMax = max($r, $g, $b);
$myMin = min($r, $g, $b);
$maxAdd =($myMax + $myMin);
$maxSub =($myMax - $myMin);//luminence is (max + min)/2
$h =0;
$s =0;
$l =($maxAdd /2.0);//if all the numbers are equal, there is no saturation (greyscale).if($myMin != $myMax){if($l <0.5){
$s =($maxSub / $maxAdd);}else{
$s =(2.0- $myMax - $myMin);//note order of opperations - can't use $maxSub here
$s =($maxSub / $s);}//find hueswitch($myMax){case $r:
$h =($g - $b);
$h =($h / $maxSub);break;case $g:
$h =($b - $r);
$h =($h / $maxSub);
$h =($h +2.0);break;case $b:
$h =($r - $g);
$h =($h / $maxSub);
$h =($h +4.0);break;}}
$hsl = hslToDegPercPerc($h, $s, $l);return $hsl;}
HSL (plage 0-1) au format Degrés, Pourcentage, Pourcentage
Pour les calculs mathématiques, HSL est plus facile à gérer dans la plage 0-1, mais pour la lisibilité humaine, c'est plus facile en degrés, en pourcentage, en pourcentage. Cette fonction prend HSL dans les plages 0-1 et renvoie HSL en degrés, pourcentage, pourcentage.
/**
* Input: HSL in ranges 0-1.
* Output: HSL in format Deg, Perc, Perc.
*
* Note: rgbToHsl calls this function by default.
*
* Multiplies $h by 60, and $s and $l by 100.
*/function hslToDegPercPerc($h, $s, $l){//convert h to degrees
$h *=60;if($h <0){
$h +=360;}//convert s and l to percentage
$s *=100;
$l *=100;
$hsl['h']= $h;
$hsl['s']= $s;
$hsl['l']= $l;return $hsl;}
HSL (format Degrés, Pourcentage, Pourcentage) à HSL dans la plage 0-1
Cette fonction convertit HSL au format Degrés, Pourcentage, Pourcentage, en plages 0-1 pour un calcul plus facile.
/**
* Input: HSL in format Deg, Perc, Perc
* Output: An array containing HSL in ranges 0-1
*
* Divides $h by 60, and $s and $l by 100.
*
* hslToRgb calls this by default.
*/function degPercPercToHsl($h, $s, $l){//convert h, s, and l back to the 0-1 range//convert the hue's 360 degrees in a circle to 1
$h /=360;//convert the saturation and lightness to the 0-1 //range by multiplying by 100
$s /=100;
$l /=100;
$hsl['h']= $h;
$hsl['s']= $s;
$hsl['l']= $l;return $hsl;}
HSL à RVB
Entrée: HSL au format Degrés, Pourcentage, Pourcentage Sortie: RVB au format 255, 255, 255.
/**
* Converts an HSL color value to RGB. Conversion formula
* adapted from http://www.niwa.nu/2013/05/math-behind-colorspace-conversions-rgb-hsl/.
* Assumes h, s, and l are in the format Degrees,
* Percent, Percent, and returns r, g, and b in
* the range [0 - 255].
*
* Called by hslToHex by default.
*
* Calls:
* degPercPercToHsl
* hueToRgb
*
* @param Number h The hue value
* @param Number s The saturation level
* @param Number l The luminence
* @return Array The RGB representation
*/function hslToRgb($h, $s, $l){
$hsl = degPercPercToHsl($h, $s, $l);
$h = $hsl['h'];
$s = $hsl['s'];
$l = $hsl['l'];//If there's no saturation, the color is a greyscale,//so all three RGB values can be set to the lightness.//(Hue doesn't matter, because it's grey, not color)if($s ==0){
$r = $l *255;
$g = $l *255;
$b = $l *255;}else{//calculate some temperary variables to make the //calculation eaisier.if($l <0.5){
$temp2 = $l *(1+ $s);}else{
$temp2 =($l + $s)-($s * $l);}
$temp1 =2* $l - $temp2;//run the calculated vars through hueToRgb to//calculate the RGB value. Note that for the Red//value, we add a third (120 degrees), to adjust //the hue to the correct section of the circle for//red. Simalarly, for blue, we subtract 1/3.
$r =255* hueToRgb($temp1, $temp2, $h +(1/3));
$g =255* hueToRgb($temp1, $temp2, $h);
$b =255* hueToRgb($temp1, $temp2, $h -(1/3));}
$rgb['r']= $r;
$rgb['g']= $g;
$rgb['b']= $b;return $rgb;}
Teinte à RVB
Cette fonction est appelée par hslToRgb pour convertir la teinte en valeurs RVB séparées.
/**
* Converts an HSL hue to it's RGB value.
*
* Input: $temp1 and $temp2 - temperary vars based on
* whether the lumanence is less than 0.5, and
* calculated using the saturation and luminence
* values.
* $hue - the hue (to be converted to an RGB
* value) For red, add 1/3 to the hue, green
* leave it alone, and blue you subtract 1/3
* from the hue.
*
* Output: One RGB value.
*
* Thanks to Easy RGB for this function (Hue_2_RGB).
* http://www.easyrgb.com/index.php?X=MATH&$h=19#text19
*
*/function hueToRgb($temp1, $temp2, $hue){if($hue <0){
$hue +=1;}if($hue >1){
$hue -=1;}if((6* $hue)<1){return($temp1 +($temp2 - $temp1)*6* $hue);} elseif ((2* $hue)<1){return $temp2;} elseif ((3* $hue)<2){return($temp1 +($temp2 - $temp1)*((2/3)- $hue)*6);}return $temp1;}
HSL à Hex
Entrée: HSL au format Degrés, Pourcentage, Pourcentage Sortie: Hex au format 00ff22 (pas de signe dièse).
Convertit en RVB, puis convertit séparément en hexadécimal.
/**
* Converts HSL to Hex by converting it to
* RGB, then converting that to hex.
*
* string hslToHex($h, $s, $l[, $prependPound = true]
*
* $h is the Degrees value of the Hue
* $s is the Percentage value of the Saturation
* $l is the Percentage value of the Lightness
* $prependPound is a bool, whether you want a pound
* sign prepended. (optional - default=true)
*
* Calls:
* hslToRgb
*
* Output: Hex in the format: #00ff88 (with
* pound sign). Rounded to the nearest whole
* number.
*/function hslToHex($h, $s, $l, $prependPound =true){//convert hsl to rgb
$rgb = hslToRgb($h,$s,$l);//convert rgb to hex
$hexR = $rgb['r'];
$hexG = $rgb['g'];
$hexB = $rgb['b'];//round to the nearest whole number
$hexR = round($hexR);
$hexG = round($hexG);
$hexB = round($hexB);//convert to hex
$hexR = dechex($hexR);
$hexG = dechex($hexG);
$hexB = dechex($hexB);//check for a non-two string length//if it's 1, we can just prepend a//0, but if it is anything else non-2,//it must return false, as we don't //know what format it is in.if(strlen($hexR)!=2){if(strlen($hexR)==1){//probably in format #0f4, etc.
$hexR ="0". $hexR;}else{//unknown formatreturnfalse;}}if(strlen($hexG)!=2){if(strlen($hexG)==1){
$hexG ="0". $hexG;}else{returnfalse;}}if(strlen($hexB)!=2){if(strlen($hexB)==1){
$hexB ="0". $hexB;}else{returnfalse;}}//if prependPound is set, will prepend a//# sign to the beginning of the hex code.//(default = true)
$hex ="";if($prependPound){
$hex ="#";}
$hex = $hex . $hexR . $hexG . $hexB;return $hex;}
J'ai fait une modification sur rgbToHsl, vous voudrez peut-être mettre à jour votre code php. Il y avait / il y a un bogue dans le code. Dans rgbToHsl () s = maxSub / (2 - maxSub)devrait êtres = maxSub / (2 - maxAdd)
Lex
@Lex D'après ici et ici , mon code est en fait correct. Je pense que vous pourriez confondre le if l < 0.5avec le else. Pouvez-vous expliquer votre réflexion? Merci d'avoir pris le temps de donner votre avis!
Cullub
1
désolé, vous avez raison, mais il y a toujours un problème d'ordre des opérations. # 8cd08c à HSL en utilisant ce calcul (2 - maxSub) = 1.7333333333333334alors qu'il devrait être comme dans le deuxième exemple de lien ( 2 - max - min ) = 0.6352941176470588. L'utilisation 2 - maxAddm'a toujours rapproché de la sortie des photoshops, donc j'ai supposé que c'était correct.
Lex
Ah d'accord. Merci d'avoir fait remarquer cela! Je l'ai réparé maintenant. J'espère que cela vous sera utile!
Cela devrait être la réponse acceptée ... beaucoup plus simple et intuitive! Pouvez-vous inverser l'algorithme?
JoelFan
@JoelFan - C'est simple mais pas correct . Il n'y a aucun moyen pour les expressions rationnelles pures (avec seulement +, -, *et /) - sont utilisés par définition pour les conversions de couleurs - pour les exprimer à l'aide des sinefonctions avec les mêmes variables indépendantes (entrée). Malgré cela, c'est bien pour comprendre le principe (mais pas pour effectuer des conversions).
MarianD
Le problème avec cette solution est que MOYENNE est toujours égale à ZÉRO: (R1 + G1 + B1) = L*[ SIN(H) + SIN(H+120) + SIN(H+240) ]- et maintenant, si nous utilisons la formule sin(a)+sin(b) = 2*sin((a+b)/2)*cos((a-b)/2)pour les deux premiers sin, nous obtenons: AVERAGE=L*( sin(h+60) + sin(h+240) )et encore AVERAGE= L*2*sin(h+150)*cos(-180/2) = 0(puisque cos (-180/2) = cos (90) = 0). Le calcul de la saturation est donc erroné et en fait la saturation fonctionne ici comme la luminance.
Kamil Kiełczewski
@JoelFan Le deuxième problème avec cette solution est qu'il faut ajouter 180 degrés à H pour avoir une version "compatible" avec en.wikipedia.org/wiki/HSL_and_HSV#Converting_to_RGB (cas de test: couleur rouge pour H = 0) mais aussi il est toujours un problème avec le nombre de couleurs - dans la solution ci-dessus, les couleurs jaune, magenta et cyan sont omises et / ou mappées de manière incorrecte. Il y a js violon avec comparaison: jsfiddle.net/Lamik/9s24uc1o/10
Kamil Kiełczewski
3
Voici une version rapide, super simple et sans branche en GLSL:
Voici la fonction javascript modifiée, elle génère Hue dans un ensemble de 0 à 360 degrés.
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 ;break;case g: h =2+((b - r)/ d);break;case b: h =4+((r - g)/ d);break;}
h*=60;if(h <0) h +=360;}return([h, s, l]);}
alert(rgbToHsl(125,115,145));
J'ai eu ceci de HSL Picker de Brandon Mathis code source .
Il a été initialement écrit en CoffeeScript . Je l'ai converti en JavaScript à l'aide d'un convertisseur en ligne et j'ai supprimé le mécanisme permettant de vérifier que l'entrée utilisateur était une valeur RVB valide. Cette réponse a fonctionné pour mon cas d'utilisation, car la réponse la plus votée sur ce message que j'ai trouvée ne produisait pas de valeur HSL valide.
Notez qu'il renvoie une hslavaleur, avec areprésentant l'opacité / transparence. 0est complètement transparent et 1totalement opaque.
function rgbToHsl(rgb){var a,add, b, diff, g, h, hue, l, lum, max, min, r, s, sat;
r = parseFloat(rgb[0])/255;
g = parseFloat(rgb[1])/255;
b = parseFloat(rgb[2])/255;
max =Math.max(r, g, b);
min =Math.min(r, g, b);
diff = max - min;add= max + min;
hue = min === max ?0: r === max ?((60*(g - b)/ diff)+360)%360: g === max ?(60*(b - r)/ diff)+120:(60*(r - g)/ diff)+240;
lum =0.5*add;
sat = lum ===0?0: lum ===1?1: lum <=0.5? diff /add: diff /(2-add);
h =Math.round(hue);
s =Math.round(sat *100);
l =Math.round(lum *100);
a = parseFloat(rgb[3])||1;return[h, s, l, a];}
J'ai utilisé cela comme base pour une méthode Python. Merci.
JayJay123
ce n'est pas HSL vers RVB comme le demande l'affiche
bryc
1
Pour lorsque vous avez besoin de RVB vers HSV et vice versa à la place:
function rgbToHsv(r, g, b){
r /=255, g /=255, b /=255;var min =Math.min(r, g, b),
max =Math.max(r, g, b),
delta = max - min,
h =0, s =0, v = max;if(min != max){
s =(delta / max);switch(max){case r: h =(g - b)/ delta +(g < b ?6:0);break;case g: h =(b - r)/ delta +2;break;case b: h =(r - g)/ delta +4;break;}
h /=6;}return[h, s, v];}function hsvToRgb(h, s, v){var step = h /(1/6),
pos = step -Math.floor(step),// the hue position within the current step
m =(Math.floor(step)%2)?(1- pos)* v : pos * v,// mix color value adjusted to the brightness(v)
max =1* v,
min =(1- s)* v,
med = m +((1- s)*(v - m)),
r, g, b;switch(Math.floor(step)){case0:
r = max;
g = med;
b = min;break;case1:
r = med;
g = max;
b = min;break;case2:
r = min;
g = max;
b = med;break;case3:
r = min;
g = med;
b = max;break;case4:
r = med;
g = min;
b = max;break;case5:
r = max;
g = min;
b = med;break;}return[Math.round(r *255),Math.round(g *255),Math.round(b *255)];}
Pour tous ceux qui ont dit que la solution Garry Tan convertissait incorrectement de RVB à HSL et inversement. C'est parce qu'il a omis une fraction de nombre dans son code. J'ai corrigé son code (javascript). Désolé pour le lien sur la langue russe, mais sur l'anglais absent - HSL-wiki
function toHsl(r, g, b){
r /=255.0;
g /=255.0;
b /=255.0;var max =Math.max(r, g, b);var min =Math.min(r, g, b);var h, s, l =(max + min)/2.0;if(max == min){
h = s =0;}else{var d = max - min;
s =(l >0.5? d /(2.0- max - min): d /(max + min));if(max == r && g >= b){
h =1.0472*(g - b)/ d ;}elseif(max == r && g < b){
h =1.0472*(g - b)/ d +6.2832;}elseif(max == g){
h =1.0472*(b - r)/ d +2.0944;}elseif(max == b){
h =1.0472*(r - g)/ d +4.1888;}}return{
str:'hsl('+ parseInt(h /6.2832*360.0+0.5)+','+ parseInt(s *100.0+0.5)+'%,'+ parseInt(l *100.0+0.5)+'%)',
obj:{ h: parseInt(h /6.2832*360.0+0.5), s: parseInt(s *100.0+0.5), l: parseInt(l *100.0+0.5)}};};
Une valeur de couleur hsl | a, définie en javascript, sera instantanément convertie en rgb | a Il vous suffit alors d'accéder à la valeur de style calculée
Techniquement, je suppose que ce n'est même pas ligne de code - c'est juste fait automatiquement. Ainsi, en fonction de votre environnement, vous pourrez peut-être vous en tirer avec cela. Non pas qu'il n'y ait pas beaucoup de réponses très réfléchies ici. Je ne sais pas quel est votre objectif.
Maintenant, que faire si vous voulez convertir de rbg | a en hsl | a?
Implémentation C ++ avec probablement de meilleures performances que le code @Mohsen. Il utilise une plage [0-6] pour la teinte, évitant la division et la multiplication par 6. La plage S et L est [0,1]
Please.HEX_to_HSV('#ffeb3b')
Réponses:
Garry Tan a publié une solution Javascript sur son blog (qu'il attribue à un mjijackson.com maintenant disparu, mais est archivée ici et l'auteur original a une idée idée - grâce à user2441511).
Le code est republié ci-dessous:
HSL à RVB:
RVB à HSL:
la source
Math.round
introduit de petites inexactitudes aux extrémités inférieure et supérieure (valeurs de 0 et 255) de l'échelle. Les valeurs qui ne se trouvent pas aux extrémités de la plage peuvent être arrondies vers le haut ou vers le bas pour atteindre leur valeur, mais les valeurs ne peuvent être arrondies qu'à 0 ou à 255. Cela signifie que la plage de valeurs qui correspond à 0 et 255 est exactement la moitié de ceux pour les autres valeurs. Pour résoudre ce problème, utilisez cette formule à la place:min(floor(val*256),255)
. Cela rend la cartographie presque parfaite.h + 1/3
eth - 1/3
. Dans de nombreuses langues, cela utilise la division entière, où1/3
vaut zéro. pour obtenir des résultats corrects, en flottant littéraux au lieu, par exemple .:h + 1.0/3.0
.Trouvé le moyen le plus simple, python à la rescousse : D
la source
Color::HSL.new(40,50,60).to_rgb
Implémentation Java du code de Mohsen
Notez que tous les entiers sont déclarés comme float (ie 1f) et doivent être float, sinon vous opterez pour les couleurs grises.
HSL à RVB
RVB à HSL
la source
L'article pour HSL et HSV sur wikipedia contient quelques formules. Les calculs sont un peu délicats, il peut donc être utile de jeter un œil aux implémentations existantes .
la source
Si vous recherchez quelque chose qui est définitivement conforme à la sémantique CSS pour HSL et RGB, vous pouvez utiliser l'algorithme spécifié dans la spécification CSS 3 , qui se lit comme suit:
Je crois que c'est la source de certaines des autres réponses ici.
la source
Code C # de la réponse de Mohsen.
Voici le code de la réponse de Mohsen en C # si quelqu'un d'autre le souhaite. Remarque:
Color
est une classe personnalisée etVector4
provient d'OpenTK. Les deux sont faciles à remplacer par autre chose de votre choix.Hsl à Rgba
Rgba à Hsl
la source
Implémentation Php du code C # de Chris
Aussi d' ici , ce qui explique très bien le calcul.
Il s'agit essentiellement d'un tas de fonctions à convertir vers et depuis HSL (Hue Saturation Lightness)
Testé et fonctionnant sous PHP 5.6.15
TL; DR : Le code complet peut être trouvé ici sur Pastebin .
Hex à HSL
Entrée: couleur hexadécimale au format: [#] 0f4 ou [#] 00ff44 (signe dièse facultatif)
Sortie: TSL en degrés, pourcentage, pourcentage
RVB à HSL
Entrée: RVB dans la plage 0-255 Sortie: TSL en degrés, pourcentage, pourcentage.
HSL (plage 0-1) au format Degrés, Pourcentage, Pourcentage
Pour les calculs mathématiques, HSL est plus facile à gérer dans la plage 0-1, mais pour la lisibilité humaine, c'est plus facile en degrés, en pourcentage, en pourcentage. Cette fonction prend HSL dans les plages 0-1 et renvoie HSL en degrés, pourcentage, pourcentage.
HSL (format Degrés, Pourcentage, Pourcentage) à HSL dans la plage 0-1
Cette fonction convertit HSL au format Degrés, Pourcentage, Pourcentage, en plages 0-1 pour un calcul plus facile.
HSL à RVB
Entrée: HSL au format Degrés, Pourcentage, Pourcentage Sortie: RVB au format
255, 255, 255
.Teinte à RVB
Cette fonction est appelée par hslToRgb pour convertir la teinte en valeurs RVB séparées.
HSL à Hex
Entrée: HSL au format Degrés, Pourcentage, Pourcentage Sortie: Hex au format
00ff22
(pas de signe dièse).Convertit en RVB, puis convertit séparément en hexadécimal.
la source
rgbToHsl
, vous voudrez peut-être mettre à jour votre code php. Il y avait / il y a un bogue dans le code. Dans rgbToHsl ()s = maxSub / (2 - maxSub)
devrait êtres = maxSub / (2 - maxAdd)
if l < 0.5
avec leelse
. Pouvez-vous expliquer votre réflexion? Merci d'avoir pris le temps de donner votre avis!(2 - maxSub) = 1.7333333333333334
alors qu'il devrait être comme dans le deuxième exemple de lien( 2 - max - min ) = 0.6352941176470588
. L'utilisation2 - maxAdd
m'a toujours rapproché de la sortie des photoshops, donc j'ai supposé que c'était correct.C'est comme ça que je fais, ce qui est facile à retenir est de penser RVB comme trois rayons sur une roue, distants de 120 degrés.
La partie délicate est la saturation, qui est à une échelle inférieure à la moyenne de ces trois.
la source
+
,-
,*
et/
) - sont utilisés par définition pour les conversions de couleurs - pour les exprimer à l'aide dessine
fonctions avec les mêmes variables indépendantes (entrée). Malgré cela, c'est bien pour comprendre le principe (mais pas pour effectuer des conversions).(R1 + G1 + B1) = L*[ SIN(H) + SIN(H+120) + SIN(H+240) ]
- et maintenant, si nous utilisons la formulesin(a)+sin(b) = 2*sin((a+b)/2)*cos((a-b)/2)
pour les deux premiers sin, nous obtenons:AVERAGE=L*( sin(h+60) + sin(h+240) )
et encoreAVERAGE= L*2*sin(h+150)*cos(-180/2) = 0
(puisque cos (-180/2) = cos (90) = 0). Le calcul de la saturation est donc erroné et en fait la saturation fonctionne ici comme la luminance.Voici une version rapide, super simple et sans branche en GLSL:
Ne devient pas beaucoup plus court que ça ~
Lien vers la preuve de concept originale: https://www.shadertoy.com/view/XljGzV
(Avertissement: pas mon code!)
la source
Voici la fonction javascript modifiée, elle génère Hue dans un ensemble de 0 à 360 degrés.
la source
J'ai eu ceci de HSL Picker de Brandon Mathis code source .
Il a été initialement écrit en CoffeeScript . Je l'ai converti en JavaScript à l'aide d'un convertisseur en ligne et j'ai supprimé le mécanisme permettant de vérifier que l'entrée utilisateur était une valeur RVB valide. Cette réponse a fonctionné pour mon cas d'utilisation, car la réponse la plus votée sur ce message que j'ai trouvée ne produisait pas de valeur HSL valide.
Notez qu'il renvoie une
hsla
valeur, aveca
représentant l'opacité / transparence.0
est complètement transparent et1
totalement opaque.la source
Pour lorsque vous avez besoin de RVB vers HSV et vice versa à la place:
la source
Code C # Unity3D de la réponse de Mohsen.
Voici le code de la réponse de Mohsen en C # ciblé spécifiquement pour Unity3D. Il a été adapté de la réponse C # donnée par Alec Thilenius ci-dessus.
la source
Pour tous ceux qui ont dit que la solution Garry Tan convertissait incorrectement de RVB à HSL et inversement. C'est parce qu'il a omis une fraction de nombre dans son code. J'ai corrigé son code (javascript). Désolé pour le lien sur la langue russe, mais sur l'anglais absent - HSL-wiki
la source
Une valeur de couleur hsl | a, définie en javascript, sera instantanément convertie en rgb | a Il vous suffit alors d'accéder à la valeur de style calculée
Techniquement, je suppose que ce n'est même pas ligne de code - c'est juste fait automatiquement. Ainsi, en fonction de votre environnement, vous pourrez peut-être vous en tirer avec cela. Non pas qu'il n'y ait pas beaucoup de réponses très réfléchies ici. Je ne sais pas quel est votre objectif.
Maintenant, que faire si vous voulez convertir de rbg | a en hsl | a?
la source
Implémentation C ++ avec probablement de meilleures performances que le code @Mohsen. Il utilise une plage [0-6] pour la teinte, évitant la division et la multiplication par 6. La plage S et L est [0,1]
la source
Avec H, S et L dans la plage [0,1]:
la source
J'avais besoin d'un très léger, ce n'est pas 100%, mais il se rapproche suffisamment pour certains cas d'utilisation.
la source
Implémentation PHP du code de @ Mohsen (y compris Test!)
Désolé de re-publier ceci. Mais je n'ai vraiment vu aucune autre implémentation qui donne la qualité dont j'avais besoin.
la source