страничка создана: Лыткин А., Присмотров А.

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:

R: G: B:

 

H: S: L:

 

Перевод производился по формулам:

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:

H: S: L:

 

R: G: B:

 

Перевод из 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;

  

назад  вперед

начало