создать гладкую таблицу шестнадцатеричных градиентов - PullRequest
3 голосов
/ 03 декабря 2010

создать список шестнадцатеричных цветов?

Привет,

В настоящее время я пытаюсь создать список из 50 шестнадцатеричных цветов, которые создают плавный градиент примерно от белого до черного со всеми цветами между ними.

Как бы я поступил так в php?

Ответы [ 5 ]

6 голосов
/ 06 декабря 2010

Ну,

Хотя цвета могут быть в лучшем порядке,

Вот моя работа.

<?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;
2 голосов
/ 03 декабря 2010

со всеми цветами между

Вы можете найти путь от белого до черного, но у вас будет трудное время, включая все цвета - цветовое пространство является трехмерным, а не линейным.

Вы можете посмотреть на это для некоторых идей: http://www.exorithm.com/algorithm/view/create_gradient

0 голосов
/ 16 апреля 2018

Также может быть полезно взглянуть на мой ответ здесь .Он имеет код для преобразования любого числа из любого заданного диапазона (скажем, [0,20]) в определенный цвет, где 0 - красный, 10 - желтый, 20 - зеленый.Вы можете использовать любые цвета и даже использовать комбинацию из 4 цветов, поэтому это красный - желтый - зеленый - синий.

Demo

0 голосов
/ 26 марта 2018
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>";
}
0 голосов
/ 10 ноября 2015

Вот некоторая настройка функции, она также обрабатывает только 1 или 2 градуировку для случая, а также удаляет # на гекса до вычисления и возвращает массив цветов, начинающийся с #. так что это может быть непосредственно применено к контенту.

 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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...