ProgramingTip

C # : 시스템 색상을 기반으로 더 밝은 / 어두운 색상 만들기

bestdevel 2020. 12. 26. 15:57
반응형

C # : 시스템 색상을 기반으로 더 밝은 / 어두운 색상 만들기


복제

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


내가 가지고 가지고

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);
}

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 );

많이 사용하는 방법의 대부분은 색상을 조정하여 결과가 좋지 않습니다. 가장 좋은 대답은 Rich Newman의 HSLColor 클래스 를 사용 하고 광도를 조정하는 것입니다.

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

다음은 주어진 색상을 밝게 / 어둡게하기 위해 사용하는 자바 펼쳐보기입니다. 동등한 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 백분율을 사용하여 원하는대로 더 밝게 또는 더 어둡게 만들 수도 있습니다. 다음은 색상을 실제보다 x % 더 어둡게 만드는 방법에 대한 예입니다.

//_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))
            );
    }

도움이되기를 바랍니다.


R / G / B 방향의 모든 조합에서 음영을 얻기 위해 RGB 구성 요소도 수정하도록 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

HSI 변환기 라이브러리 사용 (Google 검색). 그런 다음 I 채널을 더 밝게 / 어둡게 조정합니다.


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

MSDN : ControlPaint의 구성원


colorglower.com 을 수행하는 사이트를 만들었습니다 . 데모를 보려면 확인하십시오.

내가 사용한 자바 스크립트 코드는 다음과 같습니다.

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;

}

이 코드는 16 진수 색상을 수신 한 다음 가장 밝은 색상 버전 10 개를 출력하고 배열에 넣습니다. 명도를 원하는대로 변경하여 음영 비율을 조정할 수 있습니다. 색상을 어둡게하려면 변경하면됩니다.

luminosity -= calcPercentage();

참조 URL : https://stackoverflow.com/questions/801406/c-create-a-lighter-darker-color-based-on-a-system-color

반응형