Как я могу перебрать шестнадцатеричные цветовые коды в PHP? - PullRequest
4 голосов
/ 21 сентября 2009

Я хочу массив, где каждое поле в массиве содержит цветовой код

array(0 => '#4CFF00', 1 => '#FFE97F')

И я хочу, чтобы это проходило через весь спектр цветов, начиная от зеленого до черного.

зеленый-> синий -> темно-синий -> фиолетовый -> желтый -> оранжевый -> красный -> коричневый -> черный

Этот порядок не должен быть точно таким же, но я думаю, вы понимаете. Кто-нибудь может помочь с этим? Есть ли сайт, который делал это раньше?

Ответы [ 9 ]

10 голосов
/ 21 сентября 2009

Вы должны использовать цветовую модель, такую ​​как Hue-Saturation-Value (HSV) , и переключать оттенок от 0 градусов по всему спектру до 360 градусов, при котором любые насыщенность и значение подходят вам , (Если вы хотите перейти от зеленого-> зеленый, просто начните с 120 градусов)

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

alt text

1 голос
/ 21 сентября 2009
function list_colours($start, $end, $steps = 6)
{
    $return = array();

    $start_r = hexdec(substr($start, 1, 2));
    $start_g = hexdec(substr($start, 3, 2));
    $start_b = hexdec(substr($start, 5, 2));

    $end_r = hexdec(substr($end, 1, 2));
    $end_g = hexdec(substr($end, 3, 2));
    $end_b = hexdec(substr($end, 5, 2));

    $shift_r = ($end_r - $start_r) / $steps;
    $shift_g = ($end_g - $start_g) / $steps;
    $shift_b = ($end_b - $start_b) / $steps;

    for ($i = 0; $i < $steps; $i++)
    {
        $color = array();
        $color[] = dechex($start_r + ($i * $shift_r));
        $color[] = dechex($start_g + ($i * $shift_g));
        $color[] = dechex($start_b + ($i * $shift_b));

        // Pad with zeros.
        $color = array_map(function ($item) {
                return str_pad($item, 2, "0", STR_PAD_LEFT);
            },
            $color
        );

        $return[] = '#' . implode($color);
    }

    return $return;
}

// Examples
$spectrum = array();
$spectrum[] = list_colours("#000000", "#FFFFFF"); // grey
$spectrum[] = list_colours("#cc0033", "#FFFFFF"); // R
$spectrum[] = list_colours("#ff6600", "#FFFFFF"); // O
$spectrum[] = list_colours("#fdc710", "#FFFFFF"); // Y
$spectrum[] = list_colours("#cccc00", "#FFFFFF"); // G
$spectrum[] = list_colours("#339933", "#FFFFFF"); // G dark
$spectrum[] = list_colours("#339999", "#FFFFFF"); // B teal
$spectrum[] = list_colours("#14acde", "#FFFFFF"); // B light
$spectrum[] = list_colours("#0066cc", "#FFFFFF"); // B dark
$spectrum[] = list_colours("#663399", "#FFFFFF"); // I dark
$spectrum[] = list_colours("#990066", "#FFFFFF"); // I light
$spectrum[] = list_colours("#cc0066", "#FFFFFF"); // V pink
1 голос
/ 21 сентября 2009
function dechexpad($i){
$s="";
if($i<16) $s="0";
$s.=dechex($i);
return $s;
}
function hexcolor($r,$g,$b){
return "#".dechexpad($r%255).dechexpad($g%255).dechexpad($b%255);
}

$xx=array();
for($i=0;$i<255;$i++){
$xx[]=hexcolor($i*4,$i*2,$i);
}
1 голос
/ 21 сентября 2009

00FF00 - зеленый, 000000 - черный. все, что вам нужно сделать, это увеличивать один цвет за раз, уменьшая другие. Вставьте его в цикл, где это будет php, javascript или что-то еще и все.

EDIT: Вот ссылка на код, который показывает, как цикл через шестнадцатеричные цветовые коды.

0 голосов
/ 28 марта 2014

Я наткнулся на этот вопрос - и удивительно, я не смог найти реального решения для этого в Интернете (я не старался). Производительность, помимо того, что здесь важно - это не то, что вы хотели бы сделать - это всего лишь упражнение, но если вы действительно хотите перебрать все шестнадцатеричные цвета - вот как вы могли бы это сделать:

for($i = 0; $i <= 16777215; $i++) {
    echo sprintf('%06s', dechex($i));
}

Конечно, этот вопрос старый и на него дан ответ, но я все равно поделюсь этим.

0 голосов
/ 21 сентября 2009

Полагаю, если вам нужны все эти цвета, вы можете построить массив элементов 16776960 следующим образом:

<?php
    $end = 'FFFFFF';

    $arrMassiveColor = array();

    for($curr = 0; $curr <= dechex($end); $curr++) {
        $arrMassiveColor[] = '#'.hexdec($curr);
    }
?>

Хотя это немного странно ...

0 голосов
/ 21 сентября 2009

Посмотрите на hexdec , dechex и этот фрагмент:

for ($i = 0; $i < 255; $i++) {
    # here happens some colour-magic
}

Приветствия

0 голосов
/ 21 сентября 2009

Я рекомендую написать функцию для этого. Если вам нужно переключиться между несколькими цветами, просто вызовите его несколько раз и объедините массивы.

Psuedocode: `colorRange(arrayReference, startColor, endColor, numSteps)`

Get {R, G, B} startColor and endColor
Get R_diff, G_diff, and B_diff

for i in 0 to numSteps {
   arrayReference.append(
          i => {min(startR, endR) + (R_diff * (i / numSteps)),
                min(startG, endG) + (G_diff * (i / numSteps)),
                min(startB, endB) + (B_diff * (i / numSteps))}
          )
}
0 голосов
/ 21 сентября 2009

Вам нужны цветовые схемы? Я думаю, что это зависит от цветовой схемы остальной части вашей страницы. Вы можете зайти в Google "Генераторы цветовых схем" и найти не менее 10. Примеры, приведенные выше в @edg и @santiiiii.

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

http://www.atalasoft.com/31apps/ColorSchemeGenerator/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...