我使用以下代码进行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
持续Decreased
和Timer03
。
所以我也写了以下代码:
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 Photoshop
,S Value
介于0-100
之间,但此处和解决方案中的0-1
也是S Value
。所以我想我必须将S Value
乘以100或将{{1}}除以100。
答案 0 :(得分:2)
要将浮点值x(范围为0..N)转换为整数i(范围为0..M),请执行以下操作:
i := Round(x*M/N);
反方向:
x := i*N/M;
通常M或N中的一个等于1,这简化了事情。
这些是色彩空间比例转换所需的所有公式。