LINUX.ORG.RU

История изменений

Исправление Stanson, (текущая версия) :

# utility routine for HLStoRGB
sub HueToRGB(@)
{
    my $n1  = shift;
    my $n2  = shift;
    my $hue = shift;

    # range check: note values passed add/subtract thirds of range
    if( $hue < 0 )      { $hue += 255; }
    if( $hue > 255 )    { $hue -= 255; }

    # return r,g, or b value from this tridrant
    if ( $hue < 43 )    { return ( $n1 + ( ( ( $n2 - $n1 ) * $hue + 21 ) / 43 ) ); }
    if ( $hue < 128 )   { return ( $n2 ); }
    if ( $hue < 170 )   { return ( $n1 + ( ( ( $n2 - $n1 ) * ( 170 - $hue) + 21 ) / 43 ) ); }
    return ( $n1 );
}

sub HLStoRGB(@)
{

    my $hue = shift;
    my $lum = shift;
    my $sat = shift;

    my $R;      # RGB component values
    my $G;
    my $B;
    my $M1;     # calculated magic numbers (really!)
    my $M2;

    if( $hue > 255 ) { $hue = 255; }
    if( $hue < 0 )   { $hue = 0; }

    if( $sat == 0 )
    {   # achromatic case
        $R = $G = $B = $lum;
    }
    else
    {   # chromatic case
        # set up magic numbers
        if( $lum <= 128) { $M2 = ( $lum * (255 + $sat) + 128) / 255; }
        else             { $M2 = $lum + $sat - ( ( $lum * $sat ) + 128 ) / 255; }

        $M1 = 2 * $lum - $M2;

        # get RGB, change units from HLSMAX to RGBMAX
        $R = ( HueToRGB( $M1, $M2, $hue + 85 ) * 255 + 128 ) / 255;
        $G = ( HueToRGB( $M1, $M2, $hue ) * 255 + 128 ) / 255;
        $B = ( HueToRGB( $M1, $M2, $hue - 85 ) * 255 + 128 ) / 255;
    }
    return sprintf( "#%02X%02X%02X", $R, $G, $B );
}

Собственно тебе нужно только H из HLS, соответственно

web_color=HLStoRGB( x, 128, 256);
где x - приведённое к диапазону 0-255 твоё число для которого нужно вычислить цвет.

Следует заметить, что Hue начинается с красного, проходит все цвета радуги до фиолетового и заканчивается опять же красным. Ибо это типа круг. Так что если надо от красного к синему, то диапазон надо урезать будет, на твой вкус.

ЗЫ: Код не мой, я только разместил объяву.

Исходная версия Stanson, :

# utility routine for HLStoRGB
sub HueToRGB(@)
{
    my $n1  = shift;
    my $n2  = shift;
    my $hue = shift;

    # range check: note values passed add/subtract thirds of range
    if( $hue < 0 )      { $hue += 255; }
    if( $hue > 255 )    { $hue -= 255; }

    # return r,g, or b value from this tridrant
    if ( $hue < 43 )    { return ( $n1 + ( ( ( $n2 - $n1 ) * $hue + 21 ) / 43 ) ); }
    if ( $hue < 128 )   { return ( $n2 ); }
    if ( $hue < 170 )   { return ( $n1 + ( ( ( $n2 - $n1 ) * ( 170 - $hue) + 21 ) / 43 ) ); }
    return ( $n1 );
}

sub HLStoRGB(@)
{

    my $hue = shift;
    my $lum = shift;
    my $sat = shift;

    my $R;      # RGB component values
    my $G;
    my $B;
    my $M1;     # calculated magic numbers (really!)
    my $M2;

    if( $hue > 255 ) { $hue = 255; }
    if( $hue < 0 )   { $hue = 0; }

    if( $sat == 0 )
    {   # achromatic case
        $R = $G = $B = $lum;
    }
    else
    {   # chromatic case
        # set up magic numbers
        if( $lum <= 128) { $M2 = ( $lum * (255 + $sat) + 128) / 255; }
        else             { $M2 = $lum + $sat - ( ( $lum * $sat ) + 128 ) / 255; }

        $M1 = 2 * $lum - $M2;

        # get RGB, change units from HLSMAX to RGBMAX
        $R = ( HueToRGB( $M1, $M2, $hue + 85 ) * 255 + 128 ) / 255;
        $G = ( HueToRGB( $M1, $M2, $hue ) * 255 + 128 ) / 255;
        $B = ( HueToRGB( $M1, $M2, $hue - 85 ) * 255 + 128 ) / 255;
    }
    return sprintf( "#%02X%02X%02X", $R, $G, $B );
}

Собственно тебе нужно только H из HLS, соответственно

web_color=HLStoRGB( x, 128, 256);
где x - приведённое к диапазону 0-255 твоё число для которого нужно вычислить цвет.

Следует заметить, что Hue начинается с красного, проходит все цвета радуги до фиолетового и заканчивается опять же красным. Ибо это типа круг. Так что если надо от красного к синему, то диапазон надо урезать будет, на твой вкус.