从数值中获取“彩虹渐变” - PHP

时间:2011-07-25 14:13:29

标签: php colors

我想要一个彩虹色渐变。

我有数值,最大值是红色,最小值是蓝色。 我试图找到一种具有比例颜色的算法,即一半将是绿色,一半和最大之间将是黄色或橙色....

我从这开始:Get color value from numeric values 但我的功能不正确,如果有人可以帮助我......我尝试使用HSV,RGB ...但我比开发者更像WebDesigner .. 谢谢!

编辑-----------------

这个帮助!非常感谢,我确信Value必须是可变的,但只有Hue才能得到正确的结果......

$h = ($value * 360) / $max;

$color = HSV_TO_RGB($h / 360, 1, 1);

第一次,我忘了将360除以0-1之间的值......我是个白痴。可以在Web上轻松找到HSV_TO_RGB函数(Google中的hsv到rgb php)。 我现在用粗体来获得正确的颜色。

非常感谢。

2 个答案:

答案 0 :(得分:0)

Basicaly你需要的是具有固定值和饱和度的HSV到RGB功能(假设饱和度和值为100)并且仅在0(你的最小值)和360(你的最大值)之间改变Hue。 你可以通过网络找到很多hsv2rgb php实现,我认为应该可以解决这个问题。

希望这个帮助

答案 1 :(得分:0)

我发现this tutorial对于创建调色板和理解彩虹通常如何生成非常有用。我建议彻底阅读,了解如何创建任意长度的重复和非重复颜色循环。

javascript很容易翻译成OpenCV Python,如下所示。 makeColorGradient生成指定count的RGB颜色列表。其余的代码只是测试它并很好地显示渐变。再次参考冷梯度类型和参数值的教程。 =)

import math
import cv2
import numpy as np

def makeColorGradient(freq1, freq2, freq3,
                      phase1, phase2, phase3,
                      center=128, width=127, count=50):

    colors = []
    for i in range(count):
        red = int(math.sin(freq1*i + phase1) * width + center);
        grn = int(math.sin(freq2*i + phase2) * width + center);
        blu = int(math.sin(freq3*i + phase3) * width + center);
        #document.write( '<font color="' + RGB2Color(red,grn,blu) + '">&#9608;</font>');
        colors.append((red,grn,blu))
    return colors

def main():
    freq = 2.4 #non repeating color set
    #freq = 0.3 #nice happy rainbow =)
    phases = [0,2,4]
    count = 67 #number of colors to generate
    colors = makeColorGradient(freq,freq,freq,
                               phases[0],phases[1],phases[2],
                               count=count)
    winname = 'Color Gradient count='+str(count)
    cv2.namedWindow(winname)

    w = 800
    h = 100
    canvas = np.zeros((h,w,3),np.uint8)
    linspace = np.linspace(0,w,count,endpoint=True)
    linspace = map(int, linspace)
    for i in range(count-1):
        r1 = (linspace[i], 0)
        r2 = (linspace[i+1], h)
        color = colors[i]
        cv2.rectangle(canvas, r1, r2, color, thickness=cv2.cv.CV_FILLED)
    cv2.imshow(winname, canvas)

    #keep window open till escape key pressed
    while(1):
        if(cv2.waitKey(15) == 27):
            break

if __name__ == '__main__':
    main()
    print 'done'