Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Преобразование цвета RGB в HLS

Delphi , Графика и Игры , Цвета и Палитра

Преобразование цвета RGB в HLS


{ Максимальные значения }
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) then
  begin
    S := 0;
    H := UNDEFINED;
  end
  else
  begin
    if (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)
    else
    if (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;
  begin
    if (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)) )
    else
    if (hue < (HLSMAX/2)) then
      result:=n2
    else
    if (hue < ((HLSMAX*2)/3)) then
      result:= ( n1 + (((n2-n1)*(((HLSMAX*2)/3)-hue)+(HLSMAX/12))/(HLSMAX/6)))
    else
      result:= ( n1 );
  end;

begin
  if (S = 0) then
  begin
    B:=round( (L*RGBMAX)/HLSMAX );
    R:=B;
    G:=B;
  end
  else
  begin
    if (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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Цвета и Палитра ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 09:00:10/0.0060749053955078/0