Создать массив цветов с помощью PHP - PullRequest
1 голос
/ 16 марта 2012

Можно ли создать массив цветов с помощью PHP?

Что я пытаюсь сделать:

  1. Выберите начальный и конечный цвета
  2. Выберите количество «шагов»
  3. Создайте массив из этих цветов, смешиваясь (в виде градиента) с таким количеством шагов.

Пример:

Начальный цвет: белый
Конечный цвет: черный
Шаги: 3

Результат:

  1. "белый",
  2. "серый",
  3. "черный"

Конечно, цвета будут в RGB / hex

У кого-нибудь есть решение по этому вопросу?

Ответы [ 5 ]

4 голосов
/ 16 марта 2012
 $greys=rainbow('000000','FFFFFF',3);

 function rainbow($start, $end, $steps)
 {
    $s=str_to_rgb($start);
    $e=str_to_rgb($end);
    $out=array();
    $r=(integer)($e['r'] - $s['r'])/$steps;
    $g=(integer)($e['g'] - $s['g'])/$steps;
    $b=(integer)($e['b'] - $s['b'])/$steps;
    for ($x=0; $x<$steps; $x++) {
       $out[]=rgb_to_str(
          $s['r']+(integer)($r * $x),
          $s['g']+(integer)($g * $x),
          $s['b']+(integer)($b * $x));
    }
    return $out;
 }
 function rgb_to_str($r, $g, $b)
 {
      return str_pad($r, 2, '0', STR_PAD_LEFT)
          .str_pad($g, 2, '0', STR_PAD_LEFT)
          .str_pad($b, 2, '0', STR_PAD_LEFT);
 }
 function str_to_rgb($str)
 {
    return array (
      'r'=>hexdec(substr($str, 0, 2)),
      'g'=>hexdec(substr($str, 3, 2)),
      'b'=>hexdec(substr($str, 5, 2))
    );
 }
1 голос
/ 16 марта 2012

Допустим, у вас есть цвета в одном числовом значении, например, от (RGB) 0x000000 до 0x112233, в первую очередь вам нужно извлечь все значения:

function hexToArray( $value){
    return array(
      'r' => ($value >> 16) & 0xff,
      'g' => ($value >> 8) & 0xff,
      'b' => ($value >> 0) & 0xff,
    );
}

, чем вы должны создатьнекоторый пошаговый алгоритм, наиболее очевидным является увеличение каждого компонента на каждом шаге:

R<sub>i</sub> = R<sub>start</sub> + floor(i * (R<sub>end</sub> - R<sub>start</sub>)/ steps)

, который будет выглядеть так:

$steps--; // Due to 0
$a = hexToArray( 0x000000);
$b = hexToArray( 0x112233);
$step = array();
$result = array();

// Prepare steps
foreach( array( 'r', 'g', 'b') as $color){
    $step[$color] = ($b[$color] - $a['color'])/$steps;
}

for( $i = 0; $i <= $steps; $i++){
    $tmp = array();
    foreach( array( 'r', 'g', 'b') as $color){
        $tmp[$color] = $a['color'] + floor($step[$color]*$i);
    }
    $result[] = $tmp;
}
return $result;

Вы также можете добавить преобразование обратно вlong int или в строку.

Если у вас будут шестнадцатеричные значения, вам также потребуется другая функция hexToArray.

1 голос
/ 16 марта 2012
//Assumption: $start and $end have the start/end colors, $steps has the step count

$start=array(255,255,255); //White
$end=array(0,0,0); //Black
$steps=3;

$colors=array($start); //You want the start color to be part of the result array
$intervals=$steps-1; //You want 3 steps to mean 2 intervals

$current=$start;
$delta=array(
   ($end[0]-$start[0])/$intervals,
   ($end[1]-$start[1])/$intervals,
   ($end[2]-$start[2])/$intervals
);

for ($i=1;$i<$intervals;$i++) {
  $current=array($current[0]+$delta[0],$current[1]+$delta[1],$current[2]+$delta[2]);
  $colors[]=array(round($current[0],$current[1],$current[2]);
}

$colors[]=$end; //You want the end color to be part of the result array

Передаст вам массив цветов, каждый из которых будет массивом r, g, b

. Для создания шестнадцатеричного представления используйте

function hexcolorFromArraycolor($arraycolor) {
  return '#'
     .substr('0'.dechex($arraycolor[0]),-2)
     .substr('0'.dechex($arraycolor[1]),-2)
     .substr('0'.dechex($arraycolor[2]),-2)
  ;
}
0 голосов
/ 24 ноября 2012

Мне нужно было взять GPS-точки с маршрута водителя и сопоставить их (используя карты Google) по времени.Я подумал, что буду радужно красить их от самых старых до самых новых.Я нашел http://www.efg2.com/Lab/ScienceAndEngineering/Spectra.htm как хорошую отправную точку.Я переписал как функции PHP ...

$blue = 0;
$factor = 0;
$green = 0;
$red = 0;

function adjustColor($color) {
    global $factor;
    if ($color == 0.0) {
        return 0;
    } else {
        return round ( 255.0 * pow ( ($color * $factor), 0.80 ) );
    }
}

function setColors($wavelength) {
    global $red, $green, $blue;
    if ($wavelength >= 380 && $wavelength <= 439) {
        $red = - ($wavelength - 440.0) / (440.0 - 380.0);
        $green = 0.0;
        $blue = 1.0;

    } elseif ($wavelength >= 440 && $wavelength <= 489) {
        $red = 0.0;
        $green = ($wavelength - 440.0) / (490.0 - 440.0);
        $blue = 1.0;

    } elseif ($wavelength >= 490 && $wavelength <= 509) {
        $red = 0.0;
        $green = 1.0;
        $blue = - ($wavelength - 510.0) / (510.0 - 490.0);

    } elseif ($wavelength >= 510 && $wavelength <= 579) {
        $red = ($wavelength - 510.0) / (580.0 - 510.0);
        $green = 1.0;
        $blue = 0.0;

    } elseif ($wavelength >= 580 && $wavelength <= 644) {
        $red = 1.0;
        $green = - ($wavelength - 645.0) / (645.0 - 580.0);
        $blue = 0.0;

    } elseif ($wavelength >= 645 && $wavelength <= 780) {
        $red = 1.0;
        $green = 0.0;
        $blue = 0.0;

    } else {
        $red = 0.0;
        $green = 0.0;
        $blue = 0.0;
    }
}

function setFactor($wavelength) {
    global $factor;
    if ($wavelength >= 380 && $wavelength <= 419) {
        $factor = 0.3 + 0.7 * ($wavelength - 380.0) / (420.0 - 380.0);
    } elseif ($wavelength >= 420 && $wavelength <= 700) {
        $factor = 1.0;
    } elseif ($wavelength >= 701 && $wavelength <= 780) {
        $factor = 0.3 + 0.7 * (780.0 - $wavelength) / (780.0 - 700.0);
    } else {
        $factor = 0.0;
    }
}

Затем используйте функции, чтобы получить цвет каждой точки.

for($i = 0; $i < $numSteps; $i ++) {
    $lambda = round ( 380 + 400 * ($i / ($numSteps - 1)) );
    setColors ( $lambda );
    setFactor ( $lambda );
    $red = adjustColor ( $red, $factor );
    $green = adjustColor ( $green, $factor );
    $blue = adjustColor ( $blue, $factor );
    $redHex = dechex ( $red );
    $redHex = (strlen ( $redHex ) < 2) ? "0" . $redHex : $redHex;
    $greenHex = dechex ( $green );
    $greenHex = (strlen ( $greenHex ) < 2) ? "0" . $greenHex : $greenHex;
    $blueHex = dechex ( $blue );
    $blueHex = (strlen ( $blueHex ) < 2) ? "0" . $blueHex : $blueHex;
    $bgcolor = "#" . $redHex . $greenHex . $blueHex;
    echo $bgcolor;
}
0 голосов
/ 16 марта 2012

Существует базовое руководство здесь о создании шестнадцатеричных цветов, которые вы можете использовать в качестве отправной точки.Ключевая идея заключается в том, чтобы научиться продвигаться вдоль отдельных шестнадцатеричных кодов RGB base-16, чтобы получить плавную последовательность цветов, а не только последовательные числа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...