Pergunta

Eu sei que isso não vai diretamente invertido uma cor, ele irá apenas 'opor-lo'. Fiquei me perguntando se alguém sabia uma maneira simples (algumas linhas de código) para inverter uma cor de qualquer cor?

No momento eu tenho isso (que não é exatamente a definição de um invertido, porque se eu passá-lo a / cor cinza retornará algo extremamente semelhante por exemplo 127, 127, 127):

const int RGBMAX = 255;

Color InvertMeAColour(Color ColourToInvert)
{
    return Color.FromArgb(RGBMAX - ColourToInvert.R, 
      RGBMAX - ColourToInvert.G, RGBMAX - ColourToInvert.B);
}
Foi útil?

Solução

Depende do que você quer dizer com "inverter" uma cor

O código fornece uma cor "negativo".

Você está procurando transformar vermelho em ciano, verde, em roxo, azul no amarelo (e assim por diante)? Se assim for, você precisa converter sua cor RGB em HSV modo (você vai encontrar aqui para make a transformação).

Em seguida, você só precisa inverter o valor Hue (mudança Hue por 360-Hue) e converter de volta para o modo RGB.

EDIT: como Alex Semeniuk mencionou, mudando Hue por (Hue + 180) % 360 é uma solução melhor (não faz invertido o Hue, mas encontrar a cor oposta no círculo de cores)

Outras dicas

Você pode usar:

MyColor=Color.FromArgb(MyColor.ToArgb()^0xffffff);

Ele vai inverter MyColor.

Tente isto:

uint InvertColor(uint rgbaColor)
{
    return 0xFFFFFF00u ^ rgbaColor; // Assumes alpha is in the rightmost byte, change as needed
}

Invert os bits de cada componente separadamente:

Color InvertMeAColour(Color ColourToInvert)
{
   return Color.FromArgb((byte)~ColourToInvert.R, (byte)~ColourToInvert.G, (byte)~ColourToInvert.B);
}

EDIT:. O operador ~ não funciona com bytes automaticamente, é necessário elenco

O que você já tem é um RGB-Invert. Há outras maneiras de cores classificar e, portanto, outras definições para o inverso de uma cor.

Mas parece que talvez você quer uma cor contrastante, e não há uma inversão simples que vai funcionar para todas as cores, incluindo RGB (127, 127, 127).

O que você precisa é 1) uma conversão para HSV (veja ThibThibs resposta) e invertido o Hue, mas também 2) Verifique se o Hue não é perto do meio e se assim ir para escuro ou completamente brilhante ou totalmente .

Se você quiser alterar todas as cores, tente uma função de rotação (mudando ou adicionando) em vez de uma função flipping (inversão). Em outras palavras, considerar a gama de 0 a 255 para cada cor única (vermelho, verde e azul) a ser acondicionada, ligado nas pontas, como um círculo de valores. Em seguida, mudar cada cor ao redor do cirle adicionando algum valor e fazendo mod 256. Por exemplo, se o seu valor inicial para o vermelho é 255, e você adicionar 1, você recebe 0. Se você mudar todas as três cores por 128, você começa dramaticamente diferente valores para cada cor original na imagem, mesmo as cinzas. Grey 127, 127, 127 torna-se branco 255, 255, 255. Grey 128, 128, 128 se torna preto 0, 0, 0. Há um efeito fotográfico assim chamada solarização, descoberto por acaso por Man Ray em 1930.

Você também pode fazer operações de rotação em cada cor (vermelho, verde, azul) por um montante diferente para realmente atrapalhar a uma imagem.

Você também pode fazer operações de rotação em matiz, mudando a tonalidade de cada cor original por uma certa quantidade no círculo matiz, que altera todas as cores sem alterar o brilho, por isso as sombras ainda olhar como sombras, fazer as pessoas olhar como Simpsons ou Smurphs por exemplo.

O código para uma mudança por 128 poderia ser semelhante a:

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);
    }
}

O mais simples e forma preguiçosa Eu fiz isso para o trabalho com ter não só 12x triplo, mas os valores mistos, é o seguinte:

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);
}

Agora, invertedColor tem uma cor diferente que o original, mesmo se temos um 128, 128, 128 ou próximo a ela valor de cor.

Eu criei esta função simples para VB.NET:

Public Shared Function Invert(ByVal Culoare As Color) As Color
    Return Color.FromArgb(Culoare.ToArgb() Xor &HFFFFFF)
End Function

E este um para C #:

public static Color Invert(Color Culoare)
{
    return Color.FromArgb(Culoare.ToArgb() ^ 0xFFFFFF);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top