Было бы полезно узнать, что вы ожидаете от второго назначения на «синий» - вы, безусловно, не получите оттенок синего (больше похожего на красный).
Проблема заключается в том, что класс Color сохраняет свои значения ARGB как Int32, поскольку каждый из 4 байтов представляет одно из значений Alpha, Red, Blue и Green.
Запрос сложения двух цветов в их форме Int32 приведет к неожиданным значениям, поскольку один байт «переполняется» в следующем (что происходит, когда вы добавляете 255 и 1?)
Color.Blue, например, -16776961. Это потому, что он имеет 4 байта, которые выглядят так:
0: 255
1: 0
2: 0
3: 255
Или:
11111111 00000000 00000000 11111111
Вам будет гораздо понятнее разбивать компоненты ARGB на отдельные байты, System.Drawing.Color позволяет вам делать это через свойства его экземпляра:
blue.A
blue.R
blue.G
blue.B
Вы можете безопасно манипулировать ими, но помните, что они являются экземпляром байта, поэтому вы не можете присвоить значение вне диапазона 0-255. Чтобы создать цвет из байтов компонента, используйте:
Color.FromArgb(a, r, g, b);
Где a, r, g, b
- байты.
Немного странно, что Color.FromArgb принимает параметры типа int, а не байты. Боюсь, я понятия не имею, почему, кто-то лучше меня должен будет ответить на это, но приведение байта к int с производным int со значением между 0 и 255, так что это безопасно использовать. Color также имеет закрытый класс CheckByte, в который он передает каждый аргумент, поэтому вы получите ArgumentException, а не неожиданный цвет (который вы, скорее всего, получите при использовании некомпонентного подхода).