C#:إنشاء أخف وزنا/لون أغمق على أساس نظام الألوان

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

  •  03-07-2019
  •  | 
  •  

سؤال

مكررة

كيف يمكنني ضبط سطوع اللون ؟
كيف يمكنني تحديد أغمق أو أفتح من لون متغير معين اللون ؟
برمجيا تفتيح لون


أقول لقد

var c = Color.Red;

الآن أريد إنشاء جديد Color هو أن أفتح أو أغمق من هذا اللون.كيف يمكن أن أفعل ذلك من دون الكثير من المتاعب ؟

هل كانت مفيدة؟

المحلول

ControlPaint.الخفيفة .الظلام .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 );

معظم هذه الطرق لا تغميق لون لكنهم ضبط هوى طريقة بكثير وبالتالي فإن النتيجة لا تبدو جيدة جدا.أفضل إجابة هو استخدام غنية نيومان 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;

    }

أخذ جوهر طريقة @بافل الجواب أنا على استعداد التاليين قليلا امتداد طرق أكثر سهولة (على الأقل بالنسبة لي) التوقيع.

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

لقد غيرت بافل Vladov وظيفة تعديل حتى RGB مكون للحصول على ظلال على أي مزيج من R/ز/ب اتجاهات:

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 نسبة الحصول عليها أفتح أو أغمق كما تريد, هنا مثال عن كيفية جعل لون أغمق 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))
            );
    }

على أمل أن يساعد.

باستخدام HSI تحويل مكتبة البحث(جوجل).ثم ضبط القناة الأولى أخف/لون أغمق.

نلقي نظرة على 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;

}

ما هذا الرمز هل هو يتلقى عرافة اللون ثم النواتج 10 اللون الأفتح الإصدارات من يضع في الصفيف.يمكنك تغيير سطوع إلى ما كنت ترغب في ضبط الظل مئوية.إلى تغميق الألوان تحتاج فقط إلى تغيير:

luminosity -= calcPercentage();
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top