سؤال

كيف يمكنني التحقق مما إذا كانت هياكل اثنين. drawing.color تمثل نفس اللون في عمق اللون 16 بت (أو بشكل عام بناءً على قيمة الشاشة.

دعنا نقول أنني قمت بتعيين form.transparencykekekekekekekeky (من نوع اللون) ، أريد أن أتحقق من أنه عندما يحدد المستخدم لون خلفية جديد للنموذج (value2) ، فإنني لا أقوم بتعيين النموذج الشفاف بالكامل.

على شاشات عمق اللون 32 بت ببساطة أقارن بين القيمتين:

إذا (value1 == value2)

ومع ذلك ، فإن هذا لا يعمل على شاشات عمق ألوان 16bit ، حيث أن المزيد من قيم الألوان لـ Value2 قد تمثل نفس لون 16bit الفعلي مثل Value1 ، كما اكتشفت بالطريقة الصعبة.

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

المحلول

جرب الرمز التالي:

void MyTestMethod() {
    TransparencyKey = Color.FromArgb(128, 128, 64);
    BackColor = Color.FromArgb(128, 128, 71);

    byte tR = ConvertR(TransparencyKey.R);
    byte tG = ConvertG(TransparencyKey.G);
    byte tB = ConvertB(TransparencyKey.B);

    byte bR = ConvertR(BackColor.R);
    byte bG = ConvertG(BackColor.G);
    byte bB = ConvertB(BackColor.B);

    if (tR == bR &&
        tG == bG &&
        tB == bB) {
        MessageBox.Show("Equal: " + tR + "," + tG + "," + tB + "\r\n" +
            bR + "," + bG + "," + bB);
    }
    else {
        MessageBox.Show("NOT Equal: " + tR + "," + tG + "," + tB + "\r\n" +
            bR + "," + bG + "," + bB);
    }
}

byte ConvertR(byte colorByte) {
    return (byte)(((double)colorByte / 256.0) * 32.0);
}

byte ConvertG(byte colorByte) {
    return (byte)(((double)colorByte / 256.0) * 64.0);
}

byte ConvertB(byte colorByte) {
    return (byte)(((double)colorByte / 256.0) * 32.0);
}

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

نصائح أخرى

هناك تنسيقان بكسل للألوان 16 بت ، 555 و 565. يجب عليك إخفاء قيم R و G و B مع 0xf8 (5 بت) و 0xfc (6 بت) قبل مقارنتها. ضع في اعتبارك أن الجهاز الذي تقوم بتشغيله للمصمم ليس ممثلًا للجهاز الذي يعمل عليه البرنامج.

بما أن ColorTranslator.towin32 يستخدم تحت الغطاء ، هل هذا يعمل؟

if( ColorTranslator.ToWin32(Value1) == ColorTranslator.ToWin32(Value2) )
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top