Как проверить если две Системы. Рисование. Цветовые структуры представляют то же, раскрашивают глубину цвета на 16 битов?

Как я могу проверить если две Системы. Рисование. Цветовые структуры представляют то же, раскрашивают глубину цвета на 16 битов (или обычно на основе значения Экрана. PrimaryScreen. BitsPerPixel)?

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

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

если (Value1 == Value2)

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

7
задан Jon Seigel 17 April 2010 в 22:47
поделиться

3 ответа

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

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, чтобы узнать, работает ли он на вас. Для меня сработало. И да, я знаю, что это раздутый и уродливый код, он, конечно же, предназначен для примера.

1
ответ дан 7 December 2019 в 18:43
поделиться

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

1
ответ дан 7 December 2019 в 18:43
поделиться

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

if( ColorTranslator.ToWin32(Value1) == ColorTranslator.ToWin32(Value2) )
0
ответ дан 7 December 2019 в 18:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: