{ Максимальные значения }const
HLSMAX = 240;
RGBMAX = 255;
UNDEFINED = (HLSMAX*2) div 3;
var
H, L, S: integer; { H-оттенок, L-яркость, S-насыщенность }
R, G, B: integer; { цвета }procedure RGBtoHLS;
var
cMax, cMin: integer;
Rdelta, Gdelta, Bdelta: single;
begin
cMax := max( max(R,G), B);
cMin := min( min(R,G), B);
L := round( ( ((cMax+cMin)*HLSMAX) + RGBMAX )/(2*RGBMAX) );
if (cMax = cMin) thenbegin
S := 0;
H := UNDEFINED;
endelsebeginif (L <= (HLSMAX/2)) then
S := round( ( ((cMax-cMin)*HLSMAX) + ((cMax+cMin)/2) ) / (cMax+cMin) )
else
S := round( ( ((cMax-cMin)*HLSMAX) + ((2*RGBMAX-cMax-cMin)/2) )
/ (2*RGBMAX-cMax-cMin) );
Rdelta := ( ((cMax-R)*(HLSMAX/6)) + ((cMax-cMin)/2) ) / (cMax-cMin);
Gdelta := ( ((cMax-G)*(HLSMAX/6)) + ((cMax-cMin)/2) ) / (cMax-cMin);
Bdelta := ( ((cMax-B)*(HLSMAX/6)) + ((cMax-cMin)/2) ) / (cMax-cMin);
if (R = cMax) then
H := round(Bdelta - Gdelta)
elseif (G = cMax) then
H := round( (HLSMAX/3) + Rdelta - Bdelta)
else
H := round( ((2*HLSMAX)/3) + Gdelta - Rdelta );
if (H < 0) then
H:=H + HLSMAX;
if (H > HLSMAX) then
H:= H - HLSMAX;
end;
if S<0 then
S:=0;
if S>HLSMAX then
S:=HLSMAX;
if L<0 then
L:=0;
if L>HLSMAX then
L:=HLSMAX;
end;
procedure HLStoRGB;
var
Magic1, Magic2: single;
function HueToRGB(n1, n2, hue: single): single;
beginif (hue < 0) then
hue := hue+HLSMAX;
if (hue > HLSMAX) then
hue:=hue - HLSMAX;
if (hue < (HLSMAX/6)) then
result:= ( n1 + (((n2-n1)*hue+(HLSMAX/12))/(HLSMAX/6)) )
elseif (hue < (HLSMAX/2)) then
result:=n2
elseif (hue < ((HLSMAX*2)/3)) then
result:= ( n1 + (((n2-n1)*(((HLSMAX*2)/3)-hue)+(HLSMAX/12))/(HLSMAX/6)))
else
result:= ( n1 );
end;
beginif (S = 0) thenbegin
B:=round( (L*RGBMAX)/HLSMAX );
R:=B;
G:=B;
endelsebeginif (L <= (HLSMAX/2)) then
Magic2 := (L*(HLSMAX + S) + (HLSMAX/2))/HLSMAX
else
Magic2 := L + S - ((L*S) + (HLSMAX/2))/HLSMAX;
Magic1 := 2*L-Magic2;
R := round( (HueToRGB(Magic1,Magic2,H+(HLSMAX/3))*RGBMAX + (HLSMAX/2))/HLSMAX );
G := round( (HueToRGB(Magic1,Magic2,H)*RGBMAX + (HLSMAX/2)) / HLSMAX );
B := round( (HueToRGB(Magic1,Magic2,H-(HLSMAX/3))*RGBMAX + (HLSMAX/2))/HLSMAX );
end;
if R<0 then
R:=0;
if R>RGBMAX then
R:=RGBMAX;
if G<0 then
G:=0;
if G>RGBMAX then
G:=RGBMAX;
if B<0 then
B:=0;
if B>RGBMAX then
B:=RGBMAX;
end;
Программа на языке Pascal для конвертации цветов RGB в HLS и обратно.
Процедура RGBtoHLS
Процедура RGBtoHLS принимает значения RGB в качестве входных данных и вычисляет соответствующие значения HLS.
1. Она сначала находит максимальное и минимальное значение цвета (cMax и cMin) и вычисляет значение светимости (L).
2. Если максимальное и минимальное значения равны, она устанавливает насыщенность (S) в 0 и оттенок (H) в неопределенное значение.
3. В противном случае она вычисляет насыщенность на основе разницы между cMax и cMin, и корректирует ее в зависимости от того, находится ли светимость ниже или выше половины максимального значения.
4. Затем она вычисляет дельта-значения (Rdelta, Gdelta и Bdelta) для каждого канала цвета.
5. Основываясь на этих дельта-значениях, она вычисляет значение оттенка с помощью простой арифметической формулы.
Процедура HLStoRGB
Процедура HLStoRGB принимает значения HLS в качестве входных данных и вычисляет соответствующие значения RGB.
1. Если насыщенность равна 0, она устанавливает все три канала RGB в значение светимости.
2. В противном случае она использует функцию-lookup (HueToRGB) для вычисления значений RGB на основе значений оттенка, светимости и насыщенности.
Примечания
Программа использует некоторые магические числа (например, 240, 255, 3), которые seem to быть произвольными выборами максимальных значений HLS и RGB. Вам может потребоваться корректировка этих значений в зависимости от вашего конкретного использования.
Программа предполагает, что входные значения RGB находятся в диапазоне [0, 255], а выходные значения HLS - в диапазоне [0, 240]. Если вам нужно обрабатывать большие или меньшие значения, вам придется корректировать вычисления соответствующим образом.
Функция HueToRGB использует простые арифметические формулы для конвертации оттенков в RGB-значения. Это может не быть самым точным методом, особенно для цветов с сложными отношениями между оттенками.
Альтернативное решение
Если вы ищете более эффективный и точный способ конвертации между RGB и HLS, вам может потребоваться использование библиотеки или фреймворка, который предоставляет встроенные функции для конвертации цветов. Например, компонент TColor в Delphi имеет встроенное поддержку конвертации между различными цветовыми пространствами, включая RGB и HLS.
Альтернативно, вы можете использовать более сложный алгоритм конвертации цветов,such as the CIECAM02 algorithm, which is designed to provide more accurate conversions between different color spaces. However, this would likely require more complex calculations and may not be suitable for all use cases.
Преобразование цвета RGB в HLS - это процесс, который позволяет изменить представление цвета из пространства RGB (красный, зеленый, синий) в пространство HLS (хрома, лuminance, saturation), что может быть полезно для различных задач компьютерной графики.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.