首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将HSB转换为RGB

如何将HSB转换为RGB
EN

Stack Overflow用户
提问于 2013-07-19 18:24:39
回答 2查看 4.3K关注 0票数 1

我有一个用Timer04修改Label01 Font Color的Delphi XE2 Project。所以我写了以下代码:

代码语言:javascript
复制
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的值将从增加到100。如果该值达到100,它将减少到,并且它将连续循环。

在我的例子中,我选择了HUE=135SATURATION=85BRIGHTNESS=50BRIGHTNESS的值将从50增加到100,然后从100减少到,并将继续。但问题是,在Delphi XE2中,没有这样的Function可用于将HSB转换为RGB,反之亦然。我已经查过了。但是我已经找到任何作为HSBToRGBFunction。只有一些Delphi Unit可用。我读过他们的撤销声明,发现每个人都有一些bug。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-19 19:55:21

这是一个Delphi的C代码的翻译,可以在这里找到:http://www.cs.rit.edu/~ncs/color/t_convert.html

代码语言:javascript
复制
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;

我已经进行了这个最低限度的测试。请随时再检查一遍。

票数 2
EN

Stack Overflow用户

发布于 2018-07-22 22:20:30

对于火猴来说,它是来自System.UIConsts.pas的HSLtoRGB,它类似于HSB (=HSV)。使用HSB所能做的就是使用HSL

代码语言:javascript
复制
function HSLtoRGB(H, S, L: Single): TAlphaColor;

它返回FMX TAlphaColor -即RGB。对于VCL,你需要TColor,那就是BGR。

因此,请在同一单元中使用RGBtoBGR

代码语言:javascript
复制
function RGBtoBGR(const C: TAlphaColor): TAlphaColor;

然后做彩色:= TColor(MyAlphaColorVariable);

AFAIK没有使用标准单位的HSB函数。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17743821

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档