var_R = ( R / 255 ) //RGB from 0 to 255
var_G = ( G / 255 )
var_B = ( B / 255 )
var_Min = min( var_R, var_G, var_B ) //Min. value of RGB
var_Max = max( var_R, var_G, var_B ) //Max. value of RGB
del_Max = var_Max - var_Min //Delta RGB value
L = ( var_Max + var_Min ) / 2
if ( del_Max == 0 ) //This is a gray, no chroma...
{
H = 0 //HSL results from 0 to 1
S = 0
}
else //Chromatic data...
{
if ( L < 0.5 ) S = del_Max / ( var_Max + var_Min )
else S = del_Max / ( 2 - var_Max - var_Min )
del_R = ( ( ( var_Max - var_R ) / 6 ) + ( del_Max / 2 ) ) / del_Max
del_G = ( ( ( var_Max - var_G ) / 6 ) + ( del_Max / 2 ) ) / del_Max
del_B = ( ( ( var_Max - var_B ) / 6 ) + ( del_Max / 2 ) ) / del_Max
if ( var_R == var_Max ) H = del_B - del_G
else if ( var_G == var_Max ) H = ( 1 / 3 ) + del_R - del_B
else if ( var_B == var_Max ) H = ( 2 / 3 ) + del_G - del_R
if ( H < 0 ) ; H += 1
if ( H > 1 ) ; H -= 1
}
Перевожу его на Delphi:
procedure TForm1.mnuMaxSaturationClick(Sender: TObject);
type
TRGBTripleArray = array[0..10000] of TRGBTriple;
PRGBTripleArray = ^TRGBTripleArray;
var
SL: PRGBTripleArray;
line,p: Integer;
R, G, B, ColorMin, ColorMax, DeltaMax: Single;
H, S, L: Single;
DeltaR, DeltaG, DeltaB: Single;
begin
with Image1.Canvas do
begin
Brush.Style:= bsClear;
Pixels[1, 1]:= Pixels[1, 1];
for line:= 0 to Image1.Picture.Bitmap.Height - 1 do
begin
SL:= Image1.Picture.Bitmap.ScanLine[line];
for p:= 0 to Image1.Picture.Bitmap.Width - 1 do
begin
R:= SL.rgbtRed/255;
G:= SL.rgbtGreen/255;
B:= SL.rgbtBlue/255;
ColorMin:= Min(Min(R,G),B);
ColorMax:= Max(Max(R,G),B);
DeltaMax:= ColorMax-ColorMin;
L:= (ColorMin+ColorMax)/2;
if DeltaMax=0 then
begin
H:=0;
S:=0;
end
else begin
if L<0.5 then S:=DeltaMax/(ColorMin+ColorMax)
else S:=(DeltaMax/(2-ColorMax-ColorMin));
DeltaR:=(((ColorMax-R)/6)+(ColorMax/2))/DeltaMax;
DeltaG:=(((ColorMax-G)/6)+(ColorMax/2))/DeltaMax;
DeltaB:=(((ColorMax-B)/6)+(ColorMax/2))/DeltaMax;
if R=ColorMax then
H:=DeltaB-DeltaG
else
if G=ColorMax then
H:=(1/3)+DeltaR-DeltaB
else
if B=ColorMax then
H:=(2/3)+DeltaG-DeltaR;
if H<0 then
H:=H+1
else
if H>1 then
H:=H-1
end;
end;
end;
end;
end;
Трансляция кода
Нашел пример перевода в HSL и обратно в RGB на easyrgb.com. Вот исходник:
Код:
Почему-то переменная S вообще не изменяется (всегда равна 0). И компилятор выдает предупреждение, что переменная S never used, а переменная H может быть не определена. Помогите понять в чем причина.
Дополнительно прилагаю весь исходник
Заранее благодарен за помощь.
Это действительно так. Переменная S нигде не используется, лишь вычисляется, а переменная H при определенных условиях может не получить начального значения. Сделай в конце ShowMessage(IntToStr(H)+' '+IntToStr(S)) и будет тебе пол-счастья.
Код:
H := <DefaultValue>; // Значение по умолчанию. Если не знамо чого ставить, тогда нолег :)
Ну дык ShowMessage() это и есть применение. Чтоб в дебаггере посмотреть что получается по ходу выполнения. А вот потом уже - применить как надо.
ну если только так... :)
Код:
if DeltaMax=0 then
begin
H:=0;
S:=0;
end
begin
H:=0;
S:=0;
end
выдает [Hint] MainModule.pas(134): Value assigned to 'S' never used
Почему?
Большое спасибо откликнувшимся.
гы. ты же переменной S значение присваиваешь? присваиваешь. а где ты ее потом используешь? зачем вообще ее объявил?