生成平滑的十六进制梯度表

时间:2010-12-03 04:42:05

标签: php loops hex

生成十六进制颜色列表?

你好,

目前我正在尝试生成一个包含50个十六进制颜色的列表,这些颜色可以创建从白色到黑色的粗略平滑渐变,其中包含所有颜色。

我将如何在php中执行此操作?

5 个答案:

答案 0 :(得分:6)

那么,

虽然颜色可能有更好的顺序,但

这是我的工作。

<?php

function Gradient($HexFrom, $HexTo, $ColorSteps) {
  $FromRGB['r'] = hexdec(substr($HexFrom, 0, 2));
  $FromRGB['g'] = hexdec(substr($HexFrom, 2, 2));
  $FromRGB['b'] = hexdec(substr($HexFrom, 4, 2));

  $ToRGB['r'] = hexdec(substr($HexTo, 0, 2));
  $ToRGB['g'] = hexdec(substr($HexTo, 2, 2));
  $ToRGB['b'] = hexdec(substr($HexTo, 4, 2));

  $StepRGB['r'] = ($FromRGB['r'] - $ToRGB['r']) / ($ColorSteps - 1);
  $StepRGB['g'] = ($FromRGB['g'] - $ToRGB['g']) / ($ColorSteps - 1);
  $StepRGB['b'] = ($FromRGB['b'] - $ToRGB['b']) / ($ColorSteps - 1);

  $GradientColors = array();

  for($i = 0; $i <= $ColorSteps; $i++) {
    $RGB['r'] = floor($FromRGB['r'] - ($StepRGB['r'] * $i));
    $RGB['g'] = floor($FromRGB['g'] - ($StepRGB['g'] * $i));
    $RGB['b'] = floor($FromRGB['b'] - ($StepRGB['b'] * $i));

    $HexRGB['r'] = sprintf('%02x', ($RGB['r']));
    $HexRGB['g'] = sprintf('%02x', ($RGB['g']));
    $HexRGB['b'] = sprintf('%02x', ($RGB['b']));

    $GradientColors[] = implode(NULL, $HexRGB);
  }
  $GradientColors = array_filter($GradientColors, "len");
  return $GradientColors;
}

function len($val){
  return (strlen($val) == 6 ? true : false );
}

$count = 0;
$steps = 9;
$Gradients = Gradient("FFFFFF", "FF0000", $steps);
foreach($Gradients as $Gradient)
    echo '<div style="background-color: #' . strtoupper($Gradient) . '">' . htmlentities('<option value="' . strtoupper($Gradient) . '">' . strtoupper($Gradient) . '</option>') . '</div>';
$count += count($Gradients);

$Gradients = Gradient("df1f00", "00FF00", $steps);
foreach($Gradients as $Gradient)
    echo '<div style="background-color: #' . strtoupper($Gradient) . '">' . htmlentities('<option value="' . strtoupper($Gradient) . '">' . strtoupper($Gradient) . '</option>') . '</div>';
$count += count($Gradients);

$Gradients = Gradient("00df1f", "0000FF", $steps);
foreach($Gradients as $Gradient)
    echo '<div style="background-color: #' . strtoupper($Gradient) . '">' . htmlentities('<option value="' . strtoupper($Gradient) . '">' . strtoupper($Gradient) . '</option>') . '</div>';
$count += count($Gradients);

$Gradients = Gradient("0000df", "000000", $steps);
foreach($Gradients as $Gradient)
    echo '<div style="background-color: #' . $Gradient . '">' . htmlentities('<option value="' . $Gradient . '">' . $Gradient . '</option>') . '</div>';
$count += count($Gradients);

echo 'count: ' . $count;

答案 1 :(得分:2)

  

中包含所有颜色

您可以找到从白色到黑色的路径,但是您将很难包括所有颜色 - 颜色空间是三维的,而不是线性的。

你可以看一下这个想法: http://www.exorithm.com/algorithm/view/create_gradient

答案 2 :(得分:0)

这是函数的一些自定义,它还处理只需要1或2个刻度的情况,并且在计算之前删除#on上的#并从#开始发回颜色数组。这样就可以直接应用于内容。

 public function gradient($from_color, $to_color, $graduations = 10) {
        $graduations--;
        $startcol = str_replace("#", "", $from_color);
        $endcol = str_replace("#", "", $to_color);
        $RedOrigin = hexdec(substr($startcol, 0, 2));
        $GrnOrigin = hexdec(substr($startcol, 2, 2));
        $BluOrigin = hexdec(substr($startcol, 4, 2));
        if ($graduations >= 2) { // for at least 3 colors
            $GradientSizeRed = (hexdec(substr($endcol, 0, 2)) - $RedOrigin) / $graduations; //Graduation Size Red
            $GradientSizeGrn = (hexdec(substr($endcol, 2, 2)) - $GrnOrigin) / $graduations;
            $GradientSizeBlu = (hexdec(substr($endcol, 4, 2)) - $BluOrigin) / $graduations;
            for ($i = 0; $i <= $graduations; $i++) {
                $RetVal[$i] = strtoupper("#" . str_pad(dechex($RedOrigin + ($GradientSizeRed * $i)), 2, '0', STR_PAD_LEFT) .
                        str_pad(dechex($GrnOrigin + ($GradientSizeGrn * $i)), 2, '0', STR_PAD_LEFT) .
                        str_pad(dechex($BluOrigin + ($GradientSizeBlu * $i)), 2, '0', STR_PAD_LEFT));
            }
        } elseif ($graduations == 1) { // exactlly 2 colors
            $RetVal[] = $from_color;
            $RetVal[] = $to_color;
        } else { // one color
            $RetVal[] = $from_color;
        }
        return $RetVal;
    }

答案 3 :(得分:0)

function rgb2hex($rgb) {
$hex = "#";
$hex .= str_pad(dechex($rgb[0]), 2, "0", STR_PAD_LEFT);
$hex .= str_pad(dechex($rgb[1]), 2, "0", STR_PAD_LEFT);
$hex .= str_pad(dechex($rgb[2]), 2, "0", STR_PAD_LEFT);

return $hex; // returns the hex value including the number sign (#)
}

function dif($c1, $c2, $percent) {
$array=array();
for($x=0;$x<3;$x++) {
$d=($c2[$x]-$c1[$x])*$percent+$c1[$x];
$array[]=(int)$d;
}
return $array;
}

for($x=0;$x<=255;$x++) {
echo rgb2hex( dif(array(255,255,255), array(0,0,0), $x/255 /*percent*/) );
echo "<br>";
}

答案 4 :(得分:0)

看看我的回答here也很有帮助。 它具有将任何给定范围(例如[0,20])中的任何数字转换为特定颜色的代码,其中0为红色,10为黄色,20为绿色。你可以使用任何颜色,甚至使用4种颜色的组合,所以它是红色 - 黄色 - 绿色 - 蓝色。

Demo