【问题标题】:Get a "rainbow gradient" from numeric values - PHP从数值中获取“彩虹渐变” - PHP
【发布时间】:2011-07-25 14:13:29
【问题描述】:

我想要一个彩虹色的渐变。

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

我从这个开始: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 之间的值……我是个白痴。 HSV_TO_RGB 函数可以在 Web 上轻松找到(Google 中的 hsv 到 rgb php)。 我现在得到了正确的颜色,使用毛圈。

非常感谢。

【问题讨论】:

  • 显示您的代码。我们不会为您编写函数 - 我们是来帮助您的,而不是您的工作。

标签: php colors


【解决方案1】:

基本上,您需要的是一个 HSV 到 RGB 函数,具有固定的值和饱和度(比如说 100 表示饱和度和值),并且只在 0(您的最小值)和 360(您的最大值)之间更改色调。 您可以在网络上找到许多 hsv2rgb php 实现,我认为这应该可以解决问题。

希望有帮助

【讨论】:

    【解决方案2】:

    我发现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'
    

    【讨论】:

      猜你喜欢
      • 2016-09-14
      • 2011-01-18
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-10
      • 2015-07-02
      • 2017-10-05
      相关资源
      最近更新 更多