C#: 시스템 색상을 기준으로 가벼우거나 어두운 색상 생성

StackOverflow https://stackoverflow.com/questions/801406

  •  03-07-2019
  •  | 
  •  

문제

복제하다

색상의 밝기를 어떻게 조정합니까?
주어진 색상의 어둡거나 밝은 색상 변형을 어떻게 결정합니까?
프로그래밍 방식으로 색상을 밝게합니다


내가 가지고 있다고 말해

var c = Color.Red;

이제 새로운 것을 만들고 싶습니다 Color 그것은 그 색상보다 가볍거나 어둡습니다. 너무 많은 번거 로움없이 어떻게 할 수 있습니까?

도움이 되었습니까?

해결책

ControlPaint.light .dark .darkdark 등

Color lightRed = ControlPaint.Light( Color.Red );

다른 팁

나는 최근에 이것에 대해 블로그를 작성했습니다. 주요 아이디어는 각 색상 구성 요소에 주어진 보정 계수를 적용하는 것입니다. 다음 정적 방법은 지정된 보정 계수로 주어진 색상의 밝기를 수정하고 해당 색상의 더 어둡거나 가벼운 변형을 생성합니다.

/// <summary>
/// Creates color with corrected brightness.
/// </summary>
/// <param name="color">Color to correct.</param>
/// <param name="correctionFactor">The brightness correction factor. Must be between -1 and 1. 
/// Negative values produce darker colors.</param>
/// <returns>
/// Corrected <see cref="Color"/> structure.
/// </returns>
public static Color ChangeColorBrightness(Color color, float correctionFactor)
{
    float red = (float)color.R;
    float green = (float)color.G;
    float blue = (float)color.B;

    if (correctionFactor < 0)
    {
        correctionFactor = 1 + correctionFactor;
        red *= correctionFactor;
        green *= correctionFactor;
        blue *= correctionFactor;
    }
    else
    {
        red = (255 - red) * correctionFactor + red;
        green = (255 - green) * correctionFactor + green;
        blue = (255 - blue) * correctionFactor + blue;
    }

    return Color.FromArgb(color.A, (int)red, (int)green, (int)blue);
}

a를 사용 하여이 작업을 수행 할 수도 있습니다 Lerp 기능. XNA에는 하나가 있지만 스스로 쓰기 쉽습니다.

보다 이 비슷한 질문에 대한 나의 대답 C# 구현을 위해.

함수를 사용하면 다음을 수행 할 수 있습니다.

// make red 50% lighter:
Color.Red.Lerp( Color.White, 0.5 );

// make red 75% darker:
Color.Red.Lerp( Color.Black, 0.75 );

// make white 10% bluer:
Color.White.Lerp( Color.Blue, 0.1 );

이러한 방법의 대부분은 색상을 어둡게하지만 색조 방식을 많이 조정하여 결과가 그다지 좋아 보이지 않습니다. 가장 좋은 대답은 사용하는 것입니다 리치 뉴먼의 HSLCOLOR 광도를 클래스하고 조정하십시오.

public Color Darken(Color color, double darkenAmount) {
    HSLColor hslColor = new HSLColor(color);
    hslColor.Luminosity *= darkenAmount; // 0 to 1
    return hslColor;
}

다음은 주어진 색상의 번개/어두워지기 위해 사용하는 JavaScript 코드입니다. 동등한 C# 함수의 기반으로 사용할 수 있습니다.

각 RGB 구성 요소의 순수한 흰색으로부터 거리를 계산 한 다음 제공된 요인 별로이 거리를 조정하여 작동합니다. 새로운 거리는 새로운 색상을 계산하는 데 사용됩니다. 0에서 1 사이의 계수는 어두워지며 1보다 높은 계수가 밝아집니다.

function Darken( hexColor, factor )
    {   
        if ( factor < 0 ) factor = 0;

        var c = hexColor;
        if ( c.substr(0,1) == "#" )
        {
            c = c.substring(1);
        }

        if ( c.length == 3 || c.length == 6 )
        {
            var i = c.length / 3;

            var f;  // the relative distance from white

            var r = parseInt( c.substr(0, i ), 16 );
            f = ( factor * r / (256-r) );
            r = Math.floor((256 * f) / (f+1));

            r = r.toString(16);
            if ( r.length == 1 ) r = "0" + r;

            var g = parseInt( c.substr(i, i), 16);
            f = ( factor * g / (256-g) );
            g = Math.floor((256 * f) / (f+1));
            g = g.toString(16);
            if ( g.length == 1 ) g = "0" + g;

            var b = parseInt( c.substr( 2*i, i),16 );
            f = ( factor * b / (256-b) );
            b = Math.floor((256 * f) / (f+1));
            b = b.toString(16);
            if ( b.length == 1 ) b = "0" + b;

            c =  r+g+b;
         }   

         return "#" + c;

    }

핵심 방법을 취합니다 @Pavel의 대답 나는보다 직관적 인 (적어도 나에게) 서명을 위해 다음 두 가지 작은 확장 방법을 준비했습니다.

public static Color LightenBy(this Color color, int percent)
{
    return ChangeColorBrightness(color, percent/100.0);
}

public static Color DarkenBy(this Color color, int percent)
{
    return ChangeColorBrightness(color, -1 * percent / 100.0); 
}

RGB 구성 요소를 수정하여 R/G/B 방향의 조합에 대한 색조를 얻기 위해 Pavel Vladov 기능을 변경했습니다.

Public Function ChangeColorShades(color As Color, correctionFactor As Single, bR As Boolean, bG As Boolean, bB As Boolean) As Color


    Dim red As Single = CSng(color.R)
    Dim green As Single = CSng(color.G)
    Dim blue As Single = CSng(color.B)

    If (correctionFactor < 0) Then

        correctionFactor = 1 + correctionFactor
        If bR Then
            red *= correctionFactor
        End If
        If bG Then
            green *= correctionFactor
        End If
        If bB Then
            blue *= correctionFactor
        End If


    Else
        If bR Then
            red = (255 - red) * correctionFactor + red
        End If
        If bG Then
            green = (255 - green) * correctionFactor + green
        End If
        If bB Then
            blue = (255 - blue) * correctionFactor + blue
        End If

    End If

    Return color.FromArgb(color.A, CInt(red), CInt(green), CInt(blue))
End Function

RGB 백분율로 단순히 작업하여 원하는대로 가볍게하거나 어둡게 할 수 있습니다. 다음은 색상을 더 어둡게 만드는 방법에 대한 예입니다.

//_correctionfactory in percentage, e.g 50 = make it darker 50%
    private Color DarkerColor(Color color, float correctionfactory = 50f)
    {
        const float hundredpercent = 100f;                        
        return Color.FromArgb((int)(((float)color.R / hundredpercent) * correctionfactory),
            (int)(((float)color.G / hundredpercent) * correctionfactory), (int)(((float)color.B / hundredpercent) * correctionfactory));
    }

한 가지 더 우리는 프로세스를 더 가볍게 되돌릴 수있는 한 가지 더 가벼워지면 255 -RGB의 결과를 얻은 다음 다음 예와 같이 원하는 비율을 곱합니다.

private Color LighterColor(Color color, float correctionfactory = 50f)
    {
        correctionfactory = correctionfactory / 100f;
        const float rgb255 = 255f;
        return Color.FromArgb((int)((float)color.R + ((rgb255 - (float)color.R) * correctionfactory)), (int)((float)color.G + ((rgb255 - (float)color.G) * correctionfactory)), (int)((float)color.B + ((rgb255 - (float)color.B) * correctionfactory))
            );
    }

도움이되기를 바랍니다.

HSI 변환기 라이브러리 사용 (Google 검색). 그런 다음 더 가벼운 색상으로 채널을 조정하십시오.

ControlPaint 클래스를 살펴보십시오.

MSDN : ControlPaint 회원

나는 이것을하는 사이트를 만들었다 ColorGlower.com 데모를 확인하려면 확인할 수 있습니다.

다음은 내가 사용한 JavaScript 코드입니다.

function lighten(color) {

// convert to decimal and change luminosity
var luminosity = 0.01
var computedColors = new Array();
var newColor = "#",
    c, i, n, black = 0,
    white = 255;
for (n = 0; n < 10; n++) {
    for (i = 0; i < 3; i++) {
        c = parseInt(color.substr(i * 2, 2), 16);
        c = Math.round(Math.min(Math.max(black, c + (luminosity * white)), white)).toString(16);
        newColor += ("00" + c).substr(c.length);
    }

    computedColors[n] = newColor;
    var arrayUnique = checkIfArrayIsUnique(computedColors);
    if (arrayUnique == false) {
        computedColors.pop();
        break;
    }

    computedColors[n] = newColor;
    newColor = "#";
    luminosity += calcPercentage();
}

return computedColors;

}

이 코드가하는 일은 육각 색상을 수신 한 다음 10 개의 가장 가벼운 색상 버전을 출력하여 배열에 넣는 것입니다. 광도를 그늘 백분율을 조정하기 위해 원하는대로 광도를 변경할 수 있습니다. 변경 해야하는 색상을 어둡게하려면 다음과 같습니다.

luminosity -= calcPercentage();
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top