1

我有一个 Delphi XE2 项目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将其固定(比如绿色),并且亮度的值将从0增加到100。如果该值达到100,它将减少到0,并将继续循环。

对于我的情况,我选择HUE=135SATURATION=85BRIGHTNESS=50。的值BRIGHTNESS会从50增加到100,然后会从100减少到0并继续。Function但问题是HSB在. 我已经搞定了。但我发现任何as 。只有一些可用。我阅读了他们的评论,发现每个人都有一些错误。RGBDelphi XE2FunctionHSBToRGBDelphi Unit

4

2 回答 2

2

这是在此处找到的 C 代码的 Delphi 翻译: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;

我已经做了这个最小的测试。请随时仔细检查。

于 2013-07-19T11:55:21.423 回答
-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;

然后只做 Color := TColor(MyAlphaColorVariable);

AFAIK 标准单位没有 HSB 功能。

于 2018-07-22T14:20:29.683 回答