Форум программистов, компьютерный форум, киберфорум
Наши страницы
Ales'hon'ne
Войти
Регистрация
Восстановить пароль
Оценить эту запись

Преобразование RGB-HSL

Запись от Ales'hon'ne размещена 17.02.2013 в 15:32
Метки delphi/pascal, hsl, rgb, цвет

Функции для преобразования цветов из человекоудобной системы HSL в компьютероудобную RGB и обратно.
Суть системы HSL (для тех, кто не знает)
Нажмите на изображение для увеличения
Название: color-wheel.jpg
Просмотров: 1279
Размер:	144.0 Кб
ID:	1736
Итоговый цвет в HSL получается путём выбора основного тона (H, hue) и его насыщенности (S, saturation) и светлоты (L, lightness). В качестве иллюстрации можно представить лампочку, которую нужно покрасить. Вы можете выбрать краску на цветовом круге. Если перейти в полярную систему, то координатами выбранной краски будут угол поворота - тон, и радиус - густота нанесения краски, то есть насыщенность. Светлотой же будет сила тока, поданная на покрашенную лампочку. Как видно, эта система гораздо удобнее для человека, нежели RGB. Основной же её недостаток - сложность обратного преобразования. Впрочем, недостатком можно считать и использование действительных чисел для хранения значений.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
uses
  Math;
 
type
  TRGBColor=record
    r,g,b:byte;
  end;
  THSLColor=record
    h,s,l:double;
  end;
 
function RGB2HSL(v: TRGBColor): THSLColor;
var
  mx,mn: double;
begin
  mx:=max(max(v.r,v.g),v.b);
  mn:=min(min(v.r,v.g),v.b);
  Result.l:=(mx+mn)/510; //510=2*255
  if (Result.l=0) or (mx=mn) then
    Result.s:=0
  else if Result.l<=0.5 then
    Result.s:=(mx-mn)/(mx+mn)
  else if Result.l<>1 then
    Result.s:=(mx-mn)/(510-mx-mn)
  else
    Result.s:=1;
  if mx=mn then
    Result.h:=0
  else if mx=v.r then
    Result.h:=60*(v.g-v.b)/(mx-mn)+IfThen(v.g<v.b,360,0)
  else if mx=v.g then
    Result.h:=60*(v.b-v.r)/(mx-mn)+120
  else
    Result.h:=60*(v.r-v.g)/(mx-mn)+240
end;
 
function HSL2RGB(v: THSLColor): TRGBColor;
var
  q,p,h: double;
  t,c: array[1..3] of double;
  i: integer;
begin
  if v.l<0.5 then
    q:=v.l*(1+v.s)
  else
    q:=v.l+v.s-(v.l*v.s);
  p:=2*v.l-q;
  h:=v.h/360;
  t[1]:=h+1/3;
  t[2]:=h;
  t[3]:=h-1/3;
  for i:=1 to 3 do
    if t[i]<0 then
      t[i]:=t[i]+1
    else if t[i]>1 then
      t[i]:=t[i]-1;
  for i:=1 to 3 do
    if t[i]<1/6 then
      c[i]:=(q-p)*6*t[i]+p
    else if InRange(t[i],1/6,0.5) then
      c[i]:=q
    else if InRange(t[i],0.5,2/3) then
      c[i]:=(q-p)*(2/3-t[i])*6+p
    else
      c[i]:=p;
  Result.r:=round(c[1]*255);
  Result.g:=round(c[2]*255);
  Result.b:=round(c[3]*255);
end;
Размещено в Без категории
Просмотров 1718 Комментарии 0
Всего комментариев 0
Комментарии
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru