用于将HSL转换为RGB或十六进制的PHP函数
有人知道PHP函数(for>5.3)可以将HSL颜色转换为RGB或十六进制吗?我已经尝试了十几次谷歌搜索,但我发现没有一个功能像预期的那样有效 函数是否转换为RGB或十六进制并不重要,因为这两者之间的转换非常简单。输入是CSS的HSL值(色调:0-360,饱和度:0-100,亮度:0-100)用于将HSL转换为RGB或十六进制的PHP函数,php,css,hsl,Php,Css,Hsl,有人知道PHP函数(for>5.3)可以将HSL颜色转换为RGB或十六进制吗?我已经尝试了十几次谷歌搜索,但我发现没有一个功能像预期的那样有效 函数是否转换为RGB或十六进制并不重要,因为这两者之间的转换非常简单。输入是CSS的HSL值(色调:0-360,饱和度:0-100,亮度:0-100) 编辑:指定输入和输出格式将是一个额外的好处:)从Jim注释()链接中的一个答案中获取代码,我们可以按如下方式计算: <?php $hue = 209; $sat = 75;
编辑:指定输入和输出格式将是一个额外的好处:)从Jim注释()链接中的一个答案中获取代码,我们可以按如下方式计算:
<?php
$hue = 209;
$sat = 75;
$lum = 60;
$hue /= 360;
$sat /= 100;
$lum /= 100;
$result = ColorHSLToRGB($hue, $sat, $lum);
var_dump($result); echo '<br>';
printf("rgb = %d,%d,%d<br>", $result['r'], $result['g'], $result['b']);
function ColorHSLToRGB($h, $s, $l){
$r = $l;
$g = $l;
$b = $l;
$v = ($l <= 0.5) ? ($l * (1.0 + $s)) : ($l + $s - $l * $s);
if ($v > 0){
$m;
$sv;
$sextant;
$fract;
$vsf;
$mid1;
$mid2;
$m = $l + $l - $v;
$sv = ($v - $m ) / $v;
$h *= 6.0;
$sextant = floor($h);
$fract = $h - $sextant;
$vsf = $v * $sv * $fract;
$mid1 = $m + $vsf;
$mid2 = $v - $vsf;
switch ($sextant)
{
case 0:
$r = $v;
$g = $mid1;
$b = $m;
break;
case 1:
$r = $mid2;
$g = $v;
$b = $m;
break;
case 2:
$r = $m;
$g = $v;
$b = $mid1;
break;
case 3:
$r = $m;
$g = $mid2;
$b = $v;
break;
case 4:
$r = $mid1;
$g = $m;
$b = $v;
break;
case 5:
$r = $v;
$g = $m;
$b = $mid2;
break;
}
}
return array('r' => $r * 255.0, 'g' => $g * 255.0, 'b' => $b * 255.0);
}
?>
PEAR包具有在颜色模型之间转换的方法-请参阅 如果您有十进制RGB值(enhzflep演示了如何获取它们),则可以轻松获取
#ab01cd
十六进制web字符串:
$rgb['r'] = ($t = round($rgb['r'] * 255, 0)) < 15 ? '0'.dechex($t) : dechex($t);
$rgb['g'] = ($t = round($rgb['g'] * 255, 0)) < 15 ? '0'.dechex($t) : dechex($t);
$rgb['b'] = ($t = round($rgb['b'] * 255, 0)) < 15 ? '0'.dechex($t) : dechex($t);
$hexweb = "#".$rgb['r'].$rgb['g'].$rgb['b'];
$rgb['r']=($t=round($rgb['r']*255,0))<150.dechex($t):dechex($t);
$rgb['g']=($t=round($rgb['g']*255,0))<150.dechex($t):dechex($t);
$rgb['b']=($t=round($rgb['b']*255,0))<150.dechex($t):dechex($t);
$hexweb=“#”。$rgb['r']。$rgb['g']。$rgb['b'];
将这些放在一起(这有助于我制作)
/**
*将HSL颜色方案转换为十六进制(默认)或RGB。
*
*我们需要一种方法,可以通过编程生成一系列颜色
*在两个值之间(如红色到绿色),这很容易用HSL实现,因为
*你只要改变颜色就行了。(0=红色,120=绿色)。你可以使用这个功能
*将这些hsl颜色值转换为rgb或十六进制颜色方案。
*你有
*hsl(50、100%、50%)
*转化,
*$hex=convertHSL(50100,50);//返回#ffd500
*或
*$rgb=convertHSL(50100,50,假);//返回rgb(255、213、0)
*
*看https://coderwall.com/p/dvsxwg/smoothly-transition-from-green-to-red
*@param int$h色调
*@param int$s饱和度
*@param int$l亮度
*@param bool$toHex是否需要十六进制等效值或rgb等效值
*@返回字符串在HTML或CSS中可用
*/
函数convertHSL($h、$s、$l、$toHex=true){
$h/=360;
$s/=100;
$l/=100;
$r=$l;
$g=$l;
$b=$l;
$v=($l 0){
百万美元;
$sv;
$六分仪;
$fract;
$vsf;
$mid1;
$mid2;
$m=$l+$l-$v;
$sv=($v-$m)/$v;
$h*=6.0;
$六分仪=楼层($h);
$fract=$h-$六分仪;
$vsf=$v*$sv*$fract;
$mid1=$m+$vsf;
$mid2=$v-$vsf;
开关(六分仪)
{
案例0:
$r=$v;
$g=$mid1;
$b=$m;
打破
案例1:
$r=$mid2;
$g=$v;
$b=$m;
打破
案例2:
$r=$m;
$g=$v;
$b=$mid1;
打破
案例3:
$r=$m;
$g=$mid2;
$b=$v;
打破
案例4:
$r=$mid1;
$g=$m;
$b=$v;
打破
案例5:
$r=$v;
$g=$m;
$b=$mid2;
打破
}
}
$r=四舍五入($r*255,0);
$g=圆形($g*255,0);
$b=四舍五入($b*255,0);
如果($toHex){
$r=($r<15)‘0’。十进制($r):十进制($r);
$g=($g<15)‘0’。十进制($g):十进制($g);
$b=($b<15)‘0’。十进制($b):十进制($b);
返回“#$r$g$b”;
}否则{
返回“rgb($r,$g,$b)”;
}
这是我的解决方案
HSV值限制:$H[0-359]、$S[0-100]、$V[0-100]
function hsv_to_rgb($iH, $iS, $iV) {
if($iH < 0) $iH = 0;
if($iH > 360) $iH = 360;
if($iS < 0) $iS = 0;
if($iS > 100) $iS = 100;
if($iV < 0) $iV = 0;
if($iV > 100) $iV = 100;
$dS = $iS/100.0;
$dV = $iV/100.0;
$dC = $dV*$dS;
$dH = $iH/60.0;
$dT = $dH;
while($dT >= 2.0) $dT -= 2.0; // php modulus does not work with float
$dX = $dC*(1-abs($dT-1)); // as used in the Wikipedia link
switch($dH) {
case($dH >= 0.0 && $dH < 1.0):
$dR = $dC; $dG = $dX; $dB = 0.0; break;
case($dH >= 1.0 && $dH < 2.0):
$dR = $dX; $dG = $dC; $dB = 0.0; break;
case($dH >= 2.0 && $dH < 3.0):
$dR = 0.0; $dG = $dC; $dB = $dX; break;
case($dH >= 3.0 && $dH < 4.0):
$dR = 0.0; $dG = $dX; $dB = $dC; break;
case($dH >= 4.0 && $dH < 5.0):
$dR = $dX; $dG = 0.0; $dB = $dC; break;
case($dH >= 5.0 && $dH < 6.0):
$dR = $dC; $dG = 0.0; $dB = $dX; break;
default:
$dR = 0.0; $dG = 0.0; $dB = 0.0; break;
}
$dM = $dV - $dC;
$dR += $dM; $dG += $dM; $dB += $dM;
$dR *= 255; $dG *= 255; $dB *= 255;
return array(round($dR), round($dG), round($dB));
}
功能hsv到rgb($iH,$iS,$iV){
如果($iH<0)$iH=0;
如果($iH>360)$iH=360;
如果($iS<0)$iS=0;
如果($iS>100)$iS=100;
如果($iV<0)$iV=0;
如果($iV>100)$iV=100;
$dS=$iS/100.0;
$dV=$iV/100.0;
$dC=$dV*$dS;
$dH=$iH/60.0;
$dT=$dH;
而($dT>=2.0)$dT-=2.0;//php模数不适用于浮点运算
$dX=$dC*(1-abs($dT-1));//在维基百科链接中使用
交换机($dH){
案例($dH>=0.0&$dH<1.0):
$dR=$dC;$dG=$dX;$dB=0.0;中断;
案例($dH>=1.0&$dH<2.0):
$dR=$dX;$dG=$dC;$dB=0.0;中断;
案例($dH>=2.0&$dH<3.0):
$dR=0.0;$dG=$dC;$dB=$dX;中断;
案例($dH>=3.0&$dH<4.0):
$dR=0.0;$dG=$dX;$dB=$dC;中断;
案例($dH>=4.0&$dH<5.0):
$dR=$dX;$dG=0.0;$dB=$dC;中断;
案例($dH>=5.0&$dH<6.0):
$dR=$dC;$dG=0.0;$dB=$dX;中断;
违约:
$dR=0.0;$dG=0.0;$dB=0.0;中断;
}
$dM=$dV-$dC;
$dR+=$dM;$dG+=$dM;$dB+=$dM;
$dR*=255;$dG*=255;$dB*=255;
返回数组(圆形($dR)、圆形($dG)、圆形($dB));
}
我对所有其他实现的测试只显示了奇怪的、可能无法使用的结果。下面是@Mohsen的代码的PHP实现,来自。另外还有一个测试,显示了完整的美
很抱歉交叉发布这篇文章。但我真的没有看到任何其他实现能够提供我所需要的质量
/**
* 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 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;
}
function hslToRgb($h, $s, $l){
if($s == 0){
$r = $l;
$g = $l;
$b = $l; // achromatic
}else{
$q = $l < 0.5 ? $l * (1 + $s) : $l + $s - $l * $s;
$p = 2 * $l - $q;
$r = hue2rgb($p, $q, $h + 1/3);
$g = hue2rgb($p, $q, $h);
$b = hue2rgb($p, $q, $h - 1/3);
}
return array(round($r * 255), round($g * 255), round($b * 255));
}
/* Uncomment to test * /
for ($i=0;$i<360;$i++) {
$rgb=hslToRgb($i/360, 1, .9);
echo '<div style="background-color:rgb(' .$rgb[0] . ', ' . $rgb[1] . ', ' . $rgb[2] . ');padding:2px;"></div>';
}
/* End Test */
/**
*将HSL颜色值转换为RGB。转换公式
*改编自http://en.wikipedia.org/wiki/HSL_color_space.
*假设h、s和l包含在集合[0、1]中,并且
*返回集合[0255]中的r、g和b。
*
*@param{number}h色调
*@param{number}是饱和度
*@param{number}l明度
*@return{Array}RGB表示法
*/
函数hue2rgb($p、$q、$t){
如果($t<0)$t+=1;
function hsv_to_rgb($iH, $iS, $iV) {
if($iH < 0) $iH = 0;
if($iH > 360) $iH = 360;
if($iS < 0) $iS = 0;
if($iS > 100) $iS = 100;
if($iV < 0) $iV = 0;
if($iV > 100) $iV = 100;
$dS = $iS/100.0;
$dV = $iV/100.0;
$dC = $dV*$dS;
$dH = $iH/60.0;
$dT = $dH;
while($dT >= 2.0) $dT -= 2.0; // php modulus does not work with float
$dX = $dC*(1-abs($dT-1)); // as used in the Wikipedia link
switch($dH) {
case($dH >= 0.0 && $dH < 1.0):
$dR = $dC; $dG = $dX; $dB = 0.0; break;
case($dH >= 1.0 && $dH < 2.0):
$dR = $dX; $dG = $dC; $dB = 0.0; break;
case($dH >= 2.0 && $dH < 3.0):
$dR = 0.0; $dG = $dC; $dB = $dX; break;
case($dH >= 3.0 && $dH < 4.0):
$dR = 0.0; $dG = $dX; $dB = $dC; break;
case($dH >= 4.0 && $dH < 5.0):
$dR = $dX; $dG = 0.0; $dB = $dC; break;
case($dH >= 5.0 && $dH < 6.0):
$dR = $dC; $dG = 0.0; $dB = $dX; break;
default:
$dR = 0.0; $dG = 0.0; $dB = 0.0; break;
}
$dM = $dV - $dC;
$dR += $dM; $dG += $dM; $dB += $dM;
$dR *= 255; $dG *= 255; $dB *= 255;
return array(round($dR), round($dG), round($dB));
}
/**
* 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 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;
}
function hslToRgb($h, $s, $l){
if($s == 0){
$r = $l;
$g = $l;
$b = $l; // achromatic
}else{
$q = $l < 0.5 ? $l * (1 + $s) : $l + $s - $l * $s;
$p = 2 * $l - $q;
$r = hue2rgb($p, $q, $h + 1/3);
$g = hue2rgb($p, $q, $h);
$b = hue2rgb($p, $q, $h - 1/3);
}
return array(round($r * 255), round($g * 255), round($b * 255));
}
/* Uncomment to test * /
for ($i=0;$i<360;$i++) {
$rgb=hslToRgb($i/360, 1, .9);
echo '<div style="background-color:rgb(' .$rgb[0] . ', ' . $rgb[1] . ', ' . $rgb[2] . ');padding:2px;"></div>';
}
/* End Test */
/**
* convert user email to hsl for user avatar
* @param string $string
* @return string HEX color code
*/
function stringToColor($string)
{
$hash = 0;
$l = 70;
$s = 60;
for ($i = 0; $i < strlen($string); $i++) {
$hash = ord($string[$i]) + (($hash << 5) - $hash);
}
$h = fmod($hash, 360);
return $this->hslToHex($h, $s, $l, true);
}
/**
* 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 = $this->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 format
return false;
}
}
if (strlen($hexG) != 2) {
if (strlen($hexG) == 1) {
$hexG = "0" . $hexG;
} else {
return false;
}
}
if (strlen($hexB) != 2) {
if (strlen($hexB) == 1) {
$hexB = "0" . $hexB;
} else {
return false;
}
}
//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;
}
/**
* 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)
{
//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;
//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 * $this->hueToRgb($temp1, $temp2, $h + (1 / 3));
$g = 255 * $this->hueToRgb($temp1, $temp2, $h);
$b = 255 * $this->hueToRgb($temp1, $temp2, $h - (1 / 3));
}
$rgb['r'] = $r;
$rgb['g'] = $g;
$rgb['b'] = $b;
return $rgb;
// return "rgb($r, $g, $b)";
}
/**
* 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;
}