代码之家  ›  专栏  ›  技术社区  ›  Kennethvr

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

  •  4
  • Kennethvr  · 技术社区  · 15 年前

    我想要一个数组,其中数组中的每个字段都包含一个颜色代码

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

    我想让它穿过从绿色到黑色的整个颜色光谱。

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

    这个订单不需要完全一样,但我想你明白了。 有人能帮忙吗?有没有一个网站曾经这样做过?

    9 回复  |  直到 6 年前
        1
  •  10
  •   Paul Dixon    15 年前

    你应该使用像 Hue-Saturation-Value (HSV) ,然后将色相从0度循环到360度,在360度时,任何适合您的饱和度和值。(如果您想从绿色变为绿色,只需从120度开始)

    下面是一个例子,它显示了基于RGB和HSV的渐变之间的区别:在RGB模型中,顶部渐变从绿色变为红色,而下部渐变使用HSV,从而产生更令人满意的效果。

    alt text http://i38.tinypic.com/29o0q4k.jpg

        2
  •  1
  •   n00b    15 年前
    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);
    }
    
        3
  •  1
  •   WolfmanDragon    15 年前

    00ff00为绿色,000000为黑色。你所要做的就是一次增加一种颜色,同时减少其他颜色。把它放在一个循环中,在这个循环中它是php、javascript或其他什么类型的,然后继续。

    编辑: 这里有一个代码链接,显示了如何 loop 通过十六进制颜色代码。

        4
  •  1
  •   Corey    6 年前
    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
    
        5
  •  0
  •   Lukasz Lysik    15 年前

    你需要一些配色方案吗?我想这要看你这一页其他部分的配色方案。你可以用谷歌搜索“配色方案生成器”,至少可以找到10个。以上@edg和@santiiii提供的示例。

    如果你有一张照片,有一个工具可以从照片中获取适合你的网站的颜色。

    http://www.atalasoft.com/31apps/ColorSchemeGenerator/
    
        6
  •  0
  •   Boldewyn    15 年前

    hexdec , dechex 这个片段:

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

    干杯,

        7
  •  0
  •   Buggabill    15 年前

    我想如果您需要所有这些颜色,您可以构建16776960元素数组,如下所示:

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

    不过看起来有点奇怪…

        8
  •  0
  •   Steven    15 年前

    我建议编写一个函数来执行此操作。如果需要在多个颜色之间切换,只需多次调用它并连接数组。

    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))}
              )
    }
    
        9
  •  0
  •   Michael Tremante    10 年前

    我偶然发现了这个问题——令人惊讶的是,我在网上找不到解决这个问题的真正方法(我没有努力尝试)。性能是除此之外的一点-这不是你想做的-这只是一个练习-但是如果你真的想迭代所有十六进制颜色-下面是你可以做的方法:

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

    当然,这个问题是老生常谈的,但我还是想和大家分享一下。