c# - لون - معادلة التنسيق الشرطي




التنسيق الشرطي-النسبة المئوية لتحويل اللون (6)

أنا جعلت هذه الوظيفة في جافا سكريبت. فإنه يعود اللون هو سلسلة كس. وهي تأخذ النسبة المئوية كمتغير، مع مدى يتراوح بين 0 و 100. ويمكن إجراء الخوارزمية بأي لغة:

function setColor(p){
    var red = p<50 ? 255 : Math.round(256 - (p-50)*5.12);
    var green = p>50 ? 255 : Math.round((p)*5.12);
    return "rgb(" + red + "," + green + ",0)";
}

ما هي أسهل طريقة لتحويل نسبة إلى لون يتراوح بين الأخضر (100٪) إلى الأحمر (0٪)، مع الأصفر ل 50٪؟

أنا باستخدام عادي 32bit رغب - لذلك كل مكون هو عدد صحيح بين 0 و 255. أنا أفعل هذا في C #، ولكن أعتقد لمشكلة مثل هذه اللغة لا يهم حقا أن الكثير.

استنادا إلى إجابات ماريوس وأندي أنا باستخدام الحل التالي:

double red = (percent < 50) ? 255 : 256 - (percent - 50) * 5.12;
double green = (percent > 50) ? 255 : percent * 5.12;
var color = Color.FromArgb(255, (byte)red, (byte)green, 0);

يعمل تماما - تعديل فقط كان يجب أن تجعل من حل ماريوس كان لاستخدام 256، كما (255 - (في المئة - 50) * 5.12 العائد -1 عندما 100٪، مما أدى إلى الأصفر لسبب ما في سيلفرليت (-1، 255، 0 ) -> أصفر ...


في بسيودوكود.

  • من 0-50٪ ستكون قيمة عرافة الخاص بك FFxx00 حيث:

    XX = ( Percentage / 50 ) * 255 converted into hex.
  • من 50-100 قيمة عرافة الخاص بك سيكون xxFF00 حيث:

    XX = ((100-Percentage) / 50) * 255 converted into hex.  

نأمل أن يساعد ومفهومة.


أستخدم إجراءات بيثون التالية للخلط بين الألوان:

def blendRGBHex(hex1, hex2, fraction):
    return RGBDecToHex(blendRGB(RGBHexToDec(hex1), 
                                RGBHexToDec(hex2), fraction))

def blendRGB(dec1, dec2, fraction):
    return [int(v1 + (v2-v1)*fraction) 
        for (v1, v2) in zip(dec1, dec2)]

def RGBHexToDec(hex):
    return [int(hex[n:n+2],16) for n in range(0,len(hex),2)]

def RGBDecToHex(dec):
    return "".join(["%02x"%d for d in dec])

فمثلا:

>>> blendRGBHex("FF8080", "80FF80", 0.5)
"BFBF80"

روتين آخر يلتف هذا لمزج لطيف بين القيم العددية ل "التنسيق الشرطي":

def colourRange(minV, minC, avgV, avgC, maxV, maxC, v):
    if v < minV: return minC
    if v > maxV: return maxC
    if v < avgV:
        return blendRGBHex(minC, avgC, (v - minV)/(avgV-minV))
    elif v > avgV:
        return blendRGBHex(avgC, maxC, (v - avgV)/(maxV-avgV))
    else:
        return avgC

لذلك، في قضية جوناس:

>>> colourRange(0, "FF0000", 50, "FFFF00", 100, "00FF00", 25)
"FF7F00"

كتبت هذه الوظيفة بيثون على أساس رمز جافا سكريبت. فإنه يأخذ نسبة كعشرية. أيضا لقد تربيع قيمة للحفاظ على الألوان الحمراء لفترة أطول أسفل مقياس النسبة المئوية. كما ضاقت نطاق الألوان من 255 إلى 180 لإعطاء أكثر قتامة الأحمر والأخضر في كل نهاية. هذه يمكن أن تقوم مع إعطاء ألوان لطيفة. وأود أن أضيف لمسة من البرتقال في منتصف، ولكن أنا فلدي الحصول على العمل المناسب، بو.

def getBarColour(value):
    red = int( (1 - (value*value) ) * 180 )
    green = int( (value * value )* 180 )

    red = "%02X" % red
    green = "%02X" % green

    return '#' + red + green +'00'

كما الأصفر هو مزيج من الأحمر والأخضر، يمكنك ربما تبدأ مع #F00 ثم مرر الأخضر حتى تصل إلى #FF0 ، ثم الشريحة الحمراء وصولا الى #0F0 :

for (int i = 0; i < 100; i++) {
    var red = i < 50
        ? 255
        : 255 - (256.0 / 100 * ((i - 50) * 2));
    var green = i < 50
        ? 256.0 / 100 * (i * 2)
        : 255;
    var col = Color.FromArgb((int) red, (int) green, 0);
}

ما ربما تريد القيام به هو تعيين الخاص بك 0٪ إلى 100٪ بعض النقاط في هسف أو هسل لون الفضاء. من هناك يمكنك إنتيربولات الألوان (والأصفر يحدث فقط أن يكون بين الأحمر والأخضر :) وتحويلها إلى رغب . وهذا سوف تعطيك لطيفة تبحث التدرج بين الاثنين.

على افتراض أنك ستستخدم اللون كمؤشر حالة ومن منظور واجهة المستخدم، ومع ذلك، قد لا تكون هذه فكرة جيدة، لأننا سيئون جدا لرؤية تغييرات صغيرة في اللون. لذا، فإن تقسيم القيمة إلى، مثلا، من ثلاث إلى سبع دلاء سيعطيك فروقا أكثر وضوحا عندما تتغير الأمور، على حساب بعض الدقة (التي لن تتمكن على الأرجح من تقديرها على أي حال).

لذلك، كل الرياضيات جانبا، في النهاية أود أن يوصي نظرة المتابعة الجدول مع الألوان التالية مع الخامس يجري قيمة المدخلات:

#e7241d for v <= 12%
#ef832c for v > 12% and v <= 36%
#fffd46 for v > 36% and v <= 60%
#9cfa40 for v > 60% and v <= 84%
#60f83d for v > 84%

وقد تم تحويل هذه النسب بشكل ساذج جدا من قيم هسل (0.0، 1.0، 1.0)، (30.0، 1.0، 1.0)، (60.0، 1.0، 1.0)، (90.0، 1.0، 1.0)، (120.0، 1.0، 1.0) قد ترغب في ضبط الألوان إلى حد ما لتتناسب مع أغراضك (بعض لا أحب أن الأحمر والأخضر ليست 'نقية').

لطفا أنظر:





rgb