如何在PHP中循环使用十六进制颜色代码?

4
我需要一个数组,其中每个字段都包含一个颜色代码。
array(0 => '#4CFF00', 1 => '#FFE97F')

我希望这个过程可以从绿色到黑色贯穿整个颜色谱。

绿色->蓝色->深蓝色->紫色->黄色->橙色->红色->棕色->黑色

这个顺序不需要完全相同,但我想你已经明白了我的意思。有人能帮忙吗?是否有网站已经做过这个了?


光谱中有很多颜色,从绿色到黑色。你想要全部还是只需要列出来的那些? - Glen
1
你知道那些颜色图表吗?它看起来像一道彩虹,颜色平滑地从一个色调过渡到另一个色调。我认为这就是他想要的,但他想在数组中生成它。 - John B
从绿色到黑色?你的 #FFE97F 是白色... #4CFF00 是绿色。那么黑色是怎么回事?是代码示例错误吗?还是我理解有误? - knittl
9个回答

10

您应该使用像 色调-饱和度-值(HSV) 这样的颜色模型,将色调从0度一直循环到360度,其中饱和度和值适合您。(如果您想从绿色转换到绿色,只需从120度开始)

这里有一个示例,展示了基于RGB和HSV渐变之间的区别:顶部的渐变仅在RGB模型中从绿色到红色,但下面的渐变使用了HSV,产生了更令人愉悦的效果。

alt text


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

00FF00 是绿色,000000 是黑色。你只需要逐个增加一种颜色,同时递减其他颜色。将其放入循环中,无论是 PHP、JavaScript 还是其他语言都可以。

编辑: 这里有一个链接,展示了如何循环遍历十六进制颜色代码。


0
你需要一些配色方案吗?我认为这取决于你页面的其他颜色方案。你可以谷歌“配色方案生成器”,至少可以找到10个。@edg和@santiiiii提供了一些示例。
如果你有一张照片,有一个工具可以从照片中获取颜色来适应你的网站。
http://www.atalasoft.com/31apps/ColorSchemeGenerator/

0
我建议编写一个函数来完成这个任务。如果你需要在多种颜色之间切换,只需多次调用该函数并连接数组即可。
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

看看 hexdecdechex 和这段代码:

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

祝好!


1
如果“// 这里发生了一些 *** 魔法”是所有问题的答案,那么世界将会变得更美好 -.- - knittl
是的,因为这意味着想要完成某个任务的人会先尝试自行搜索“十六进制颜色代码”,并学习它们,而不是把提问作为第一选择。 - Boldewyn

0

我猜如果你需要所有这些颜色,你可以按以下方式构建16776960个元素的数组:

<?php
    $end = 'FFFFFF';

    $arrMassiveColor = array();

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

虽然看起来有点奇怪...


0
我偶然发现了这个问题 - 令人惊讶的是,我在网上找不到实际的解决方案(我没有尝试很努力)。性能并不是重点 - 这不是你想要做的事情 - 这只是一个练习 - 但如果你真的想要迭代所有十六进制颜色 - 这里是如何做到的:
for($i = 0; $i <= 16777215; $i++) {
    echo sprintf('%06s', dechex($i));
}

当然,这个问题早已有了答案,但我还是想分享一下。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接