Получить «градиент радуги» из числовых значений - PHP - PullRequest
0 голосов
/ 25 июля 2011

Я хочу иметь градиент с цветами радуги.

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

Я начинаю с этого: Получить значение цвета из числазначения Но моя функция не верна, если кто-то может мне помочь ... Я пробую с HSV, RGB ... Но я больше WebDesigner, чем Developper .. Спасибо!

РЕДАКТИРОВАТЬ -----------------

Это поможет!Большое спасибо, я был уверен, что значение должно быть переменным, но только с оттенком я получаю правильную вещь ...

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

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

В первый раз я забыл разделить на 360, чтобы иметь значение между 0-1 ... я идиот.Функцию HSV_TO_RGB можно легко найти в Интернете (hsv to rgb php в Google).Теперь я получаю правильные цвета, используя букле.

Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 11 марта 2013

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

JavaScript был легко переведен в OpenCV Python следующим образом.makeColorGradient создает список цветов RGB указанного count.Остальная часть кода просто тестирует его и хорошо отображает градиент.Снова обратитесь к руководству по классным градиентным типам и значениям параметров.=)

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'
0 голосов
/ 25 июля 2011

По сути, вам понадобится функция HSV to RGB с фиксированными значением и насыщенностью (скажем, 100 для насыщенности и значения) и изменяющими только оттенок от 0 (минимальное значение) до 360 (максимальное значение).Вы можете найти множество реализаций PHP hsv2rgb по сети, и я думаю, что это поможет.

надеюсь, что это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...