我有一个Delphi XE2 Project使用Label01 Font Color
来更改Timer04
。所以我写了以下代码:
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 增加到 100 。如果值达到 100 ,它将减少到 0 ,并且它将连续循环。
就我而言,我选择了HUE=135
,SATURATION=85
和BRIGHTNESS=50
。 BRIGHTNESS
的值将从 50 增加到 100 ,然后从 100 减少到 0 它会继续下去。
但问题是,在Function
中没有HSB
可用于将RGB
转换为Delphi XE2
,反之亦然。我已经把它搞定了。但我发现任何Function
为HSBToRGB
。只有一些Delphi Unit
可用。我已经阅读了他们的翻版,发现每个人都有一些错误。
答案 0 :(得分:2)
以下是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;
我已经给出了这个最小的测试。请随意仔细检查。
答案 1 :(得分:-1)
对于Firemonkey,它是System.UIConsts.pas中的 HSLtoRGB 它类似于HSB(= HSV)。 HSB可以做的一切,HSL可以做的一切
function HSLtoRGB(H, S, L: Single): TAlphaColor;
它返回FMX TAlphaColor-即RGB。 对于VCL,您需要TColor,即BGR。
因此在同一单元中使用 RGBtoBGR 。
function RGBtoBGR(const C: TAlphaColor): TAlphaColor;
然后就做 颜色:= TColor(MyAlphaColorVariable);
AFAIK没有标准单位的HSB功能。