Conversion rgb <-> tsl

Contenu du snippet

J'ai cherché sur tous les sites comment passer du mode RGB à TSL et ci-ce-versa sans résultat.
Puis finalement, je suis tombé sur http://www.easyrgb.com/index.php?X=MATH&H=19#text19
Les scripts ne sont pas en PHP, alors je les ai traduits!

Source / Exemple :


<?php
private function Hue_2_RGB( $v1, $v2, $vH ){
		if ( $vH < 0 ) $vH += 1;
		if ( $vH > 1 ) $vH -= 1;
		if ( ( 6 * $vH ) < 1 ) return ( $v1 + ( $v2 - $v1 ) * 6 * $vH );
		if ( ( 2 * $vH ) < 1 ) return ( $v2 );
		if ( ( 3 * $vH ) < 2 ) return ( $v1 + ( $v2 - $v1 ) * ( ( 2 / 3 ) - $vH ) * 6 );
		return ( $v1 );
	}

	function tsl2rgb($T,$S,$L){
		//HSL from 0 to 1
		if ( $S == 0 ){
			//RGB results from 0 to 255
			$R = $L * 255;                      
			$G = $L * 255;
			$B = $L * 255;
		}else{
			if ( $L < 0.5 ){
				$var_2 = $L * ( 1 + $S );
			}else{
				$var_2 = ( $L + $S ) - ( $S * $L );
			}
			$var_1 = 2 * $L - $var_2;
			$R = 255 * $this->Hue_2_RGB( $var_1, $var_2, $T + ( 1 / 3 ) ); 
			$G = 255 * $this->Hue_2_RGB( $var_1, $var_2, $T );
			$B = 255 * $this->Hue_2_RGB( $var_1, $var_2, $T - ( 1 / 3 ) );
		}
		return array("R"=>$R,"G"=>$G,"B"=>$B);
	}

	function rgb2tsl($R,$G,$B){
		//RGB from 0 to 255
		$var_R = ( $R / 255 );
		$var_G = ( $G / 255 );
		$var_B = ( $B / 255 );

		$var_Min = min( $var_R, $var_G, $var_B );    //Min. value of RGB
		$var_Max = max( $var_R, $var_G, $var_B );    //Max. value of RGB
		$del_Max = $var_Max - $var_Min;             //Delta RGB value

		$L = ( $var_Max + $var_Min ) / 2;

		//This is a gray, no chroma...
		if ( $del_Max == 0 ){
			//HSL results from 0 to 1
			$T = 0;
			$S = 0;
		}
		//Chromatic data...
		else{
			if ( $L < 0.5 ){
				$S = $del_Max / ( $var_Max + $var_Min );
			}else{
				$S = $del_Max / ( 2 - $var_Max - $var_Min );
			}

			$del_R = ( ( ( $var_Max - $var_R ) / 6 ) + ( $del_Max / 2 ) ) / $del_Max;
			$del_G = ( ( ( $var_Max - $var_G ) / 6 ) + ( $del_Max / 2 ) ) / $del_Max;
			$del_B = ( ( ( $var_Max - $var_B ) / 6 ) + ( $del_Max / 2 ) ) / $del_Max;

			if( $var_R == $var_Max ) $T = $del_B - $del_G;
			else if ( $var_G == $var_Max ) $T = (( 1 / 3 ) + $del_R - $del_B);
			else if ( $var_B == $var_Max ) $T = (( 2 / 3 ) + $del_G - $del_R);
			if ( $T < 0 ){
				$T += 1;
			}
			if ( $T > 1 )  {
				$T -= 1;
			}
		}
		return array("T"=>$T,"S"=>$S,"L"=>$L);
    }
?>

Conclusion :


Merci à EasyRGB!!!

A voir également