2013-07-19 3 views
-1

У меня есть один Delphi XE2 Project для изменения Label01 Font Color с использованием Timer04. Поэтому я написал следующие коды:Как конвертировать HSB в RGB

procedure TMainForm.FormCreate(Sender: TObject); 
begin 
    Timer04.Enabled := true; 
end; 
.. 
.. 
.. 
.. 
.. 
procedure TMainForm.Timer04Timer(Sender: TObject); 
var 
    StartColor, RedColor, GreenColor, BlueColor: integer; 
begin 
    StartColor := ColorToRGB(Label01.Font.Color); 
    RedColor := GetRValue(StartColor); 
    GreenColor := GetGValue(StartColor); 
    BlueColor := GetBValue(StartColor); 
    if RedColor <= 251 then Inc(RedColor, 1) else RedColor := 1; 
    if GreenColor <= 252 then Inc(GreenColor, 2) else GreenColor := 2; 
    if BlueColor <= 253 then Inc(BlueColor, 3) else BlueColor := 3; 
    Label01.Font.Color := RGB(RedColor, GreenColor, BlueColor); 
end; 

Эти коды отлично работают. Label01 Font Color Изменения между разными цветами.

Теперь я пытаюсь осуществить это Label02 Color будет фиксирован (скажем зеленый) и значение brightnees будет увеличиваться от 0 до . Если значение достигнет , оно будет уменьшено до и оно будет непрерывным до петли.

Для моего случая я выбрал HUE=135, SATURATION=85 и BRIGHTNESS=50. Значение BRIGHTNESS будет увеличено с до , а затем будет уменьшаться от до и она будет продолжена. Но проблема в том, что таких Function нет в наличии для преобразования HSB в RGB и наоборот Delphi XE2. Я обманул его. Но я нашел Function как HSBToRGB. Доступно только Delphi Unit. Я прочитал их рецензии и обнаружил, что у каждого есть некоторые ошибки.

+3

Как насчет использования функции 'ColorHLSToRGB' из единицы GraphUtil.pas' и * convert *' TColorRef' в 'TColor'? И что ? Не ждите, пока я напишу ваш код. Это то, что нужно для аренды услуг coder *. И даже там я не помогу, так как я занят чем-то более важным, чем эффект воды. И я сказал вам, что код, который вы отправили в предыдущем вопросе, в порядке. – TLama

+1

Необходимо срочно удалить деталь, начиная с @TLama – bummi

+0

«Я прочитал их ревю и обнаружил, что у каждого есть некоторые ошибки». Затем исправьте эти ошибки. У вас есть формулы - http://en.wikipedia.org/wiki/HSL_and_HSV - возьмите их и примените их. –

ответ

1

Вот Delphi перевод кода C здесь: http://www.cs.rit.edu/~ncs/color/t_convert.html

function RGBFP(R, G, B: Double): TColor; 
const 
    RGBmax = 255; 
begin 
    Result := RGB(Round(RGBmax * R), Round(RGBmax * G), Round(RGBmax * B)); 
end; 

function HSVtoRGB(H, S, V: Double): TColor; 
var 
    i: Integer; 
    f, p, q, t: Double; 
begin 
    Assert(InRange(H, 0.0, 1.0)); 
    Assert(InRange(S, 0.0, 1.0)); 
    Assert(InRange(V, 0.0, 1.0)); 

    if S = 0.0 then 
    begin 
    // achromatic (grey) 
    Result := RGBFP(V, V, V); 
    exit; 
    end; 

    H := H * 6.0; // sector 0 to 5 
    i := floor(H); 
    f := H - i; // fractional part of H 
    p := V * (1.0 - S); 
    q := V * (1.0 - S * f); 
    t := V * (1.0 - S * (1.0 - f)); 
    case i of 
    0: 
    Result := RGBFP(V, t, p); 
    1: 
    Result := RGBFP(q, V, p); 
    2: 
    Result := RGBFP(p, V, t); 
    3: 
    Result := RGBFP(p, q, V); 
    4: 
    Result := RGBFP(t, p, V); 
    else 
    Result := RGBFP(V, p, q); 
    end; 
end; 

Я дал это минимальное тестирование. Пожалуйста, не стесняйтесь его проверить.

Смежные вопросы