как я могу инвертировать цвет?

<p>я знаю, что это не будет напрямую инвертировать цвет, оно будет просто «противодействовать» ему. мне было интересно, если кто-нибудь знает простой способ (несколько строк кода), чтобы инвертировать цвет из любого данного цвета?</p><p>на данный момент у меня есть это (которое не совсем соответствует определению инвертирования, потому что, если я передам ему серый/серый цвет, он вернет что-то очень похожее, например, 127, 127, 127):</p><pre><code>const int rgbmax = 255; color invertmeacolour(color colourtoinvert) { return color.fromargb(rgbmax - colourtoinvert.r, rgbmax - colourtoinvert.g, rgbmax - colourtoinvert.b); } </code></pre>

<p>это зависит от того, что вы подразумеваете под "инвертированием" цвета</p><p>ваш код обеспечивает «отрицательный» цвет.</p><p>вы ищете для преобразования красный в голубой, зеленый в фиолетовый, синий в желтый (и так далее)? если это так, вам нужно конвертировать цвет rgb в режиме <a href="http://en.wikipedia.org/wiki/hsl%5fand%5fhsv">hsv</a> (вы найдете <a href="http://en.wikipedia.org/wiki/hsl%5fand%5fhsv#conversion%5ffrom%5frgb%5fto%5fhsl%5for%5fhsv">здесь</a> , чтобы выполнить преобразование).</p><p>затем вам просто нужно инвертировать значение hue (изменить <code>hue</code> на <code>360-hue</code>) и преобразовать обратно в режим rgb.</p><p>правка: как отметил алекс семенюк, изменение <code>hue</code> на <code>(hue + 180) % 360</code> является лучшим решением (оно не инвертирует оттенок, но находит противоположный цвет на цветовом круге)</p>

<p>ты можешь использовать :</p><pre><code>mycolor=color.fromargb(mycolor.toargb()^0xffffff); </code></pre><p>это инвертирует mycolor.</p>

<p>попробуй это:</p><pre><code>uint invertcolor(uint rgbacolor) { return 0xffffff00u ^ rgbacolor; // assumes alpha is in the rightmost byte, change as needed } </code></pre>

<p>если вы хотите изменить каждый цвет, попробуйте вращательную функцию (смещение или сложение), а не функцию переворачивания (инвертирование). другими словами, рассмотрим диапазон от 0 до 255 для каждого отдельного цвета (красного, зеленого и синего), который должен быть обернут, соединен на кончиках как круг значений. затем сдвиньте каждый цвет вокруг круга, добавив некоторое значение и выполнив мод 256. например, если ваше начальное значение для красного равно 255, и вы добавляете 1, вы получите 0. если вы сместите все три цвета на 128, вы получите резко отличающиеся значения для каждого оригинального цвета на картинке, даже серых. серый 127, 127, 127 становится белым 255, 255, 255. серый 128, 128, 128 становится черным 0, 0, 0. существует такой фотографический эффект, как тот, который называется соляризация, случайно обнаруженный ман рэем в 1930-х годах.</p><p>вы также можете выполнять вращательные операции для каждого цвета (красный, зеленый, синий) на разную величину, чтобы действительно испортить картинку.</p><p>вы также можете выполнять вращательные операции с оттенком, смещая оттенок каждого исходного цвета на некоторую величину на окружности оттенка, что изменяет все цвета без изменения яркости, поэтому тени по-прежнему выглядят как тени, делая людей похожими на симпсонов или смурфов для пример.</p><p>код для сдвига на 128 может выглядеть так:</p><pre><code>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); } } </code></pre>

<p>инвертировать биты каждого компонента отдельно:</p><pre><code>color invertmeacolour(color colourtoinvert) { return color.fromargb((byte)~colourtoinvert.r, (byte)~colourtoinvert.g, (byte)~colourtoinvert.b); } </code></pre><p>правка: оператор ~ не работает с байтами автоматически, требуется приведение.</p>

<p>то, что у вас уже есть, это rgb-invert. существуют и другие способы классификации цветов и, следовательно, другие определения для инверсии цвета. </p><p>но может показаться, что вам нужен контрастный цвет, и нет простой инверсии, которая будет работать для всех цветов, включая rgb (127, 127, 127). </p><p>что вам нужно, это 1) преобразование в hsv (см. ответ thibthibs) и инвертирование оттенка, но также 2) проверка того, не должен ли оттенок быть близко к середине, и если это так, перейдите либо к полностью яркому, либо к полностью темному. </p>

<p>самый простой и ленивый способ работы с не только тройным 12-кратным, но и смешанным значением, заключается в следующем:</p><pre><code>color invertedcolor= color.fromargb(fromcolor.toargb() ^ 0xffffff); if (invertedcolor.r > 110 && invertedcolor.r < 150 && invertedcolor.g > 110 && invertedcolor.g < 150 && invertedcolor.b > 110 && invertedcolor.b < 150) { int avg = (invertedcolor.r + invertedcolor.g + invertedcolor.b) / 3; avg = avg > 128 ? 200 : 60; invertedcolor= color.fromargb(avg, avg, avg); } </code></pre><p>теперь <code>invertedcolor</code> имеет цвет, отличный от оригинала, даже если мы имеем значение цвета 128, 128, 128 или близкое к нему.</p>

<p>я создал эту простую функцию для vb.net:</p><pre><code>public shared function invert(byval culoare as color) as color return color.fromargb(culoare.toargb() xor &hffffff) end function </code></pre><p>и этот для c #:</p><pre><code>public static color invert(color culoare) { return color.fromargb(culoare.toargb() ^ 0xffffff); } </code></pre>