我正在开展一个动态商店项目,我使用循环来打印产品的所有颜色选项作为颜色框,但我真的需要添加一个“边框”这些颜色很轻.我尝试了以下的东西,但它是非常有限的,它实际上仅限于白色,它不会捕获像#ddd,#eea …等
这是我的循环:
foreach($colors as $color) { $color = trim($color); if (!empty($color)) { if (in_array($color,array('white','White','#fff','#FFF','#FFFFFF','#ffffff'))) { $bordercolor = '#bbb'; } else { $bordercolor = $color; } } }
颜色是后端的数组,如:White,#000,#cc0000等.在if / else条件中添加所有异常也是不实际的,任何快速的想法?
将HTML颜色转换为RGB,然后将色彩饱和度Lightnes(HSV)
<?PHP function HTMLToRGB($htmlCode) { if($htmlCode[0] == '#') $htmlCode = substr($htmlCode,1); if (strlen($htmlCode) == 3) { $htmlCode = $htmlCode[0] . $htmlCode[0] . $htmlCode[1] . $htmlCode[1] . $htmlCode[2] . $htmlCode[2]; } $r = hexdec($htmlCode[0] . $htmlCode[1]); $g = hexdec($htmlCode[2] . $htmlCode[3]); $b = hexdec($htmlCode[4] . $htmlCode[5]); return $b + ($g << 0x8) + ($r << 0x10); } function RGBToHSL($RGB) { $r = 0xFF & ($RGB >> 0x10); $g = 0xFF & ($RGB >> 0x8); $b = 0xFF & $RGB; $r = ((float)$r) / 255.0; $g = ((float)$g) / 255.0; $b = ((float)$b) / 255.0; $maxC = max($r,$g,$b); $minC = min($r,$b); $l = ($maxC + $minC) / 2.0; if($maxC == $minC) { $s = 0; $h = 0; } else { if($l < .5) { $s = ($maxC - $minC) / ($maxC + $minC); } else { $s = ($maxC - $minC) / (2.0 - $maxC - $minC); } if($r == $maxC) $h = ($g - $b) / ($maxC - $minC); if($g == $maxC) $h = 2.0 + ($b - $r) / ($maxC - $minC); if($b == $maxC) $h = 4.0 + ($r - $g) / ($maxC - $minC); $h = $h / 6.0; } $h = (int)round(255.0 * $h); $s = (int)round(255.0 * $s); $l = (int)round(255.0 * $l); return (object) Array('hue' => $h,'saturation' => $s,'lightness' => $l); } $colour = '#F12346'; $rgb = HTMLToRGB($colour); $hsl = RGBToHSL($rgb); var_dump($hsl);
用法:
$colour = '#F12346'; $rgb = HTMLToRGB($colour); $hsl = RGBToHSL($rgb); if($hsl->lightness > 200) { // this is light colour! }
资源:
> http://www.caperna.org/computing/repository/hsl-rgb-color-conversion-php
演示: