2010-12-03 4 views
3

генерировать список шестигранных цветов?генерировать гладкую таблицу градиента гекса

Привет,

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

Как бы я сделал это в php?

+4

** Линейный ** градиент от черного до белого может содержать только оттенки серого. – zerkms 2010-12-03 04:47:47

ответ

6

Ну,

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

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

<?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

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

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

Вы могли бы смотреть на это некоторые идеи: http://www.exorithm.com/algorithm/view/create_gradient

0

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

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; 
    } 
Смежные вопросы