如何在RGB模型到HSB模型转换后更改HSV值

时间:2013-07-19 19:56:29

标签: delphi

我有One Delphi XE2 Project

我使用以下代码进行RGB模型到HSB模型转换,反之亦然:

procedure HSVToRGB(Const H, S, V: Single; Out R, G, B: Single);
const
  SectionSize = 60/360;
var
  F: single;
  P, Q, T: single;
  Section: single;
  SectionIndex: integer;
begin
  if H < 0 then
    begin
      R:= V;
      G:= R;
      B:= R;
    end
  else
    begin
      Section:= H/SectionSize;
      SectionIndex:= Floor(Section);
      F:= Section - SectionIndex;
      P:= V * ( 1 - S );
      Q:= V * ( 1 - S * F );
      T:= V * ( 1 - S * ( 1 - F ) );
      case SectionIndex of
        0:
          begin
            R:= V;
            G:= T;
            B:= P;
          end;
        1:
          begin
            R:= Q;
            G:= V;
            B:= P;
          end;
        2:
          begin
            R:= P;
            G:= V;
            B:= T;
          end;
        3:
          begin
            R:= P;
            G:= Q;
            B:= V;
          end;
        4:
          begin
            R:= T;
            G:= P;
            B:= V;
          end;
        else
          begin
            R:= V;
            G:= P;
            B:= Q;
          end;
      end;
    end;
end;

procedure RGBToHSV(Const R, G, B: Single; Out H, S, V: Single);
var
  Range: single;
  RGB: array[0..2] of single;
  MinIndex, MaxIndex: integer;
begin
  RGB[0]:= R;
  RGB[1]:= G;
  RGB[2]:= B;

  MinIndex:= 0;
  if G < R then MinIndex:= 1;
  if B < RGB[MinIndex] then MinIndex:= 2;

  MaxIndex:= 0;
  if G > R then MaxIndex:= 1;
  if B > RGB[MaxIndex] then MaxIndex:= 2;

  Range:= RGB[MaxIndex] - RGB[MinIndex];

  if Range = 0 then
    begin
      H:= -1; 
      S:= 0; 
      V:= R; 
    end
    else
      begin
        case MaxIndex of
          0:
            begin
              H:= (G-B)/Range;
            end;
          1:
            begin
              H:= 2 + (B-R)/Range;
            end;
          2:
            begin
              H:= 4 + (R-G)/Range;
            end;
        end;
        S:= Range/RGB[MaxIndex];
        V:= RGB[MaxIndex];
        H:= H * (1/6);
        if H < 0 then H:= 1 + H;
      end;
end;

还使用David Heffernan's Code**将HSV模型转换为RGB模型转换。

我的要求是读取Label02.Color的RGB值。然后根据Adobe Specification将其转换为HSV值(即,H = 0 - 360,S = 0 - 100,V = 0 - 100)。然后更改HSV值。在此之后,V Value将使用Increased持续DecreasedTimer03

所以我也写了以下代码:

procedure TMainForm.Timer03Timer(Sender: TObject);
var
  HueOfColor, SaturationOfColor, BrightnessOfColor: single;
  RedColor, GreenColor, BlueColor: integer;
begin
  RedColor := ColorToRGB(GetRValue(Label02.Font.Color));
  GreenColor := ColorToRGB(GetGValue(Label02.Font.Color));
  BlueColor := ColorToRGB(GetBValue(Label02.Font.Color));
end;

我无法使用RGBToHSV Procedure转换它们,因为它是基数。所以我也无法更改V Value。另一件事是,根据Adobe PhotoshopS Value介于0-100之间,但此处和解决方案中的0-1也是S Value。所以我想我必须将S Value乘以100或将{{1}}除以100。

1 个答案:

答案 0 :(得分:2)

要将浮点值x(范围为0..N)转换为整数i(范围为0..M),请执行以下操作:

i := Round(x*M/N);

反方向:

x := i*N/M;

通常M或N中的一个等于1,这简化了事情。

这些是色彩空间比例转换所需的所有公式。