страничка создана: Лыткин А., Присмотров А. HSV, HSL, HSB, HSIМодели HSV, HSL, HSB, HSI во многом похожи. Они раскладывают цвет на тон ( hue )-преобладающий основной цвет, он меняется от 0 до 360 градусов , насыщенность( saturation )-чистота цвета, показывает в процентах насколько hue отсичается от нейтрального серого. При 0% сатурации нет, а при 100% она максимальна. Яркостная компонента в этих моделях обозначается по-разному. В HSV это value/volume, в HSL - lightness, в HSB - brightness, в HSI - intensity. Разница между этими моделями незначительна. Расмотрим модель HSL. Яркостная компонента в этой модели L - lightness. Она также меняется от 0 до 100 процентов: Где 0% соответствует отсутсвию света (черный цвет), а 100% полному размытию цвета. HSL - модель можно представить в цилиндрических координатах. Таким образом получаем еллипсоид: Стоит так же отметить, что такой моделью удобно пользоваться художникам. Поэтому почти во всех графических редакторах, таких как Paint Shop Pro, Adobe Photoshop и других, включены HSL/HSV-модели. При переводе из RGB в HSL будем считать, что hue - компонента и saturation - компонента меняеются от 0 до 255 Перевод из RGB в HSL: Перевод производился по формулам: procedure RGB_to_HSL(const RGB: tRGB; var HSL: tHSL); var max, min : integer; dr, dg, db :double; begin max := MaxIntValue( [ RGB.R, RGB.G, RGB.B ] ); min := MinIntValue( [ RGB.R, RGB.G, RGB.B ] ); HSL.L := Trunc( ( ( max + min )*255)/( 2*255 ) ) ; if max = min then begin HSL.S := 0 ; HSL.H := 255; end else begin if HSL.L <= 128 then HSL.S := Trunc( ( ( max-min )*255 + ( max +min )/2 )/( max+min ) ) else HSL.S := Trunc( ( ( ( max - min )*255 ) + ( ( 2*255 - max - min )/2 ) )/( 2*255 - max - min ) ) ; dr := ( ( ( max - RGB.R )*( 255/6 ) ) + ( ( max + min )/2 ) )/( max - min ) ; dg := ( ( ( max - RGB.G )*( 255/6 ) ) + ( ( max + min )/2 ) )/( max - min ) ; db := ( ( ( max - RGB.B )*( 255/6 ) ) + ( ( max + min )/2 ) )/( max - min ) ; If RGB.R = max then HSL.H := Trunc( db - dg ) else if RGB.G = max then HSL.H := Trunc( ( 255/3 ) + dr - db ) else HSL.H := Trunc( ( ( 2*255 )/3 ) + dg - dr ) ; if HSL.H < 0 then HSL.H := HSL.H + 255 ; if HSL.H > 255 then HSL.H := HSL.H-255 ; end; if HSL.S < 0 then HSL.S := 0 ; if HSL.S > 255 then HSL.S := 255 ; if HSL.L < 0 then HSL.L := 0 ; if HSL.L > 255 then HSL.L := 255 ; end ;
Перевод из HSL в RGB: Перевод из HSL в RGB осуществляется по формулам procedure HSL_to_RGB( const HSL : tHSL; var RGB : tRGB ) ; var n1, n2 : double ;
function Hue_to_RGB( n1, n2, hue : single): single ; begin if hue < 0 then hue := hue + 255 ; if hue > 255 then hue := hue -255 ; if hue < 255/6 then result := n1 + ( ( ( n2 - n1 )*hue + ( 255/12 ) )/( 255/6 ) ) else if hue < 128 then result := n2 else if hue < ( 255*2 )/3 then result := n1 + ( ( ( n2 -n1 )*( ( ( 255*2 )/3 ) - hue ) + ( 255/12 ) )/( 255/6 ) ) else result := n1 ; end;
begin if HSL.S = 0 then begin RGB.R := HSL.L ; RGB.G := HSL.L ; RGB.B := HSL.L ; end else begin if HSL.L <= 128 then n2 := ( HSL.L*( 255 + HSL.S ) )/255 else n2 := HSL.L + HSL.S - ( HSL.L*HSL.S )/255 ; n1 := 2*HSL.L - n2 ; RGB.R := Trunc( Hue_to_RGB( n1, n2, HSL.H + 256/3 ) ) ; RGB.G := Trunc( Hue_to_RGB( n1, n2, HSL.H ) ) ; RGB.B := Trunc( Hue_to_RGB( n1, n2, HSL.H - 256/3 ) ) ; end; if RGB.R < 0 then RGB.R := 0 ; if RGB.R > 255 then RGB.R := 255 ; if RGB.G < 0 then RGB.G := 0 ; if RGB.G > 255 then RGB.G := 255 ; if RGB.B < 0 then RGB.B := 0 ; if RGB.B > 255 then RGB.B := 255 ; end;
|