Если вы хотите изменить каждый цвет, попробуйте функцию вращения (смещение или добавление), а не функцию переворота (инвертирование). Другими словами, рассмотрим диапазон от 0 до 255 для каждого отдельного цвета (красного, зеленого и синего), который должен быть обернут, соединенный на кончиках, как круг значений. Затем сдвиньте каждый цвет вокруг cirle, добавив некоторое значение и выполнив mod 256. Например, если начальное значение для красного равно 255, а вы добавите 1, вы получите 0. Если вы сдвинете все три цвета на 128, вы получите совершенно разные значения для каждого исходного цвета на картинке, даже серые. Серые 127, 127, 127 становятся белыми 255, 255, 255. Серые 128, 128, 128 становятся черными 0, 0, 0. Есть фотографический эффект, подобный тому, который называется Solarization, обнаруженный случайно человеком в 30-х годах.
Вы также можете выполнять операции поворота на каждом цвете (красный, зеленый, синий) на другую величину, чтобы действительно испортить картинку.
Вы также можете выполнять поворотные операции с оттенком, изменяя оттенок каждого исходного цвета на некоторую величину в круге оттенков, который изменяет все цвета без изменения яркости, поэтому тени все еще выглядят как тени, заставляя людей выглядеть Симпсоны или Смурфы, например.
Код для сдвига на 128 может выглядеть следующим образом:
public static Color Invert(this Color c) => Color.FromArgb(c.R.Invert(), c.G.Invert(), c.B.Invert());
public static byte Invert(this byte b) {
unchecked {
return (byte)(b + 128);
}
}
Фактически, это * есть способ, которым обычно определяется инвертирование цвета ... что вы ищете вместо этого? –
Что делать, если мой цвет был 127, 127, 127, проходя через мою функцию, не инвертировал бы его. – ThePower
Возможно, вам нужно сгенерировать цвет фона, на котором будет отображаться данный цвет? –