Как проверить, представляют ли две структуры System.Drawing.Color один и тот же цвет с глубиной цвета 16 бит? - PullRequest
7 голосов
/ 02 февраля 2010

Как проверить, представляют ли две структуры System.Drawing.Color один и тот же цвет с глубиной цвета 16 бит (или, как правило, на основе значения Screen.PrimaryScreen.BitsPerPixel)?

Допустим, я установил Form.TransparencyKey в Value1 (типа Color), я хочу проверить, что, когда пользователь выбирает новый цвет фона для формы (Value2), я не устанавливаю всю форму прозрачной.

На 32-битных экранах глубины цвета я просто сравниваю два значения:

if (Value1 == Value2)

Однако это не работает на 16-битных экранах с глубиной цвета, поскольку большее количество значений цвета для Value2 будет представлять тот же фактический 16-битный цвет, что и Value1, как я выяснил сложным способом.

Ответы [ 3 ]

1 голос
/ 02 февраля 2010

Существует два формата пикселей для 16-битного цвета, 555 и 565. Вам необходимо замаскировать значения R, G и B с 0xf8 (5 бит) и 0xfc (6 бит) перед их сравнением. Помните, что машина, на которой вы запускаете конструктор, не является репрезентативной для машины, на которой работает ваша программа.

1 голос
/ 02 февраля 2010

Попробуйте следующий код:

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

Просто поиграйте с TransparancyKey и BackColor, чтобы увидеть, работает ли он для вас. Для меня это сделал. И да, я знаю, что это раздутый и уродливый код, это просто пример, конечно.

0 голосов
/ 02 февраля 2010

Поскольку ColorTranslator.ToWin32 используется под капотом, это работает?

if( ColorTranslator.ToWin32(Value1) == ColorTranslator.ToWin32(Value2) )
...