Преобразовать метод RGB? - PullRequest
0 голосов
/ 11 июня 2009

Как я могу это сделать?

int blue = Color.Blue.ToArgb();
int yellow = Color.Yellow.ToArgb();

blue = (blue + yellow) / 2;

Color Blue = ConvertFromRGB(blue);

Ответы [ 4 ]

8 голосов
/ 11 июня 2009

Я думаю, что вы ищете это:

var blueColor = Color.FromArgb((blue + yellow) / 2);

Однако я не думаю, что это даст вам результат, который вы действительно хотите.

Вы должны быть очень осторожны при смешивании цветов таким образом. Значение int, представляющее цвет в форме ARGB, является довольно произвольным в том, что касается кодера. Вероятно, лучше всего смешивать компоненты RGB по отдельности, например:

var color1 = Color.Blue;
var color2 = Color.Yellow;
var blueColor = Color.FromArgb((color1.R + color2.R) / 2,
    (color1.G + color2.G) / 2, (color1.B + color2.B) / 2);

Это интерполирует (принимая центральную точку) между двумя цветами и должно дать вам что-то, что намного больше похоже на смешение двух цветов.

(Обратите внимание, что я предполагаю, что вы имеете в виду тип System.Drawing.Color.)

3 голосов
/ 11 июня 2009

Я думаю, это то, что вы можете искать:

int blue = Color.Blue.ToArgb();
int yellow = Color.Yellow.ToArgb();

blue = (blue + yellow)/2;

Color Blue = Color.FromArgb(blue);
1 голос
/ 11 июня 2009

Просто усредните цвета по компонентам, если вы пытаетесь это сделать:

Color average = ConvertFromRGB((Color.Blue.R + Color.Yellow.R) / 2), (Color.Blue.G + Color.Yellow.G) / 2), (Color.Blue.B + Color.Yellow.B) / 2));
0 голосов
/ 11 июня 2009

Было бы полезно узнать, что вы ожидаете от второго назначения на «синий» - вы, безусловно, не получите оттенок синего (больше похожего на красный).

Проблема заключается в том, что класс 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, а не неожиданный цвет (который вы, скорее всего, получите при использовании некомпонентного подхода).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...