Domanda

So che questo non invertire direttamente un colore, sarà solo 'opporsi' esso. Mi chiedevo se qualcuno conosceva un modo semplice (poche righe di codice) per invertire un colore da un dato colore?

Al momento ho questo (che non è esattamente la definizione di un invertito, perché se lo passo un colore grigio / grigio restituisca qualcosa estremamente simile ad esempio 127, 127, 127):

const int RGBMAX = 255;

Color InvertMeAColour(Color ColourToInvert)
{
    return Color.FromArgb(RGBMAX - ColourToInvert.R, 
      RGBMAX - ColourToInvert.G, RGBMAX - ColourToInvert.B);
}
È stato utile?

Soluzione

Dipende da cosa si intende per "inversione" di un colore

Il codice fornisce un colore "negativo".

Sei alla ricerca di trasformare rosso nei colori ciano, verde in viola, blu in giallo (e così via)? Se è così, è necessario convertire il vostro colore RGB in modalità HSV (troverete qui per rendere la trasformazione).

Poi basta invertire il valore di Hue (cambiamento Hue da 360-Hue) e convertire ritorna in modalità RGB.

EDIT: come Alex Semeniuk ha menzionato, cambiando Hue da (Hue + 180) % 360 è una soluzione migliore (non invertire il Hue, ma trovare il colore opposto sul cerchio di colore)

Altri suggerimenti

È possibile utilizzare:

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

Si invertirà MyColor.

Prova questo:

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

invertire i bit di ogni componente separatamente:

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

EDIT:. L'~ operatore non funziona con i byte automaticamente, è necessario getto

Quello che già è un RGB-Inverti. Ci sono altri modi per classificare i colori e quindi altre definizioni per l'inverso di un colore.

Ma suona come forse si desidera un colore a contrasto, e non v'è una semplice inversione che sta andando a lavorare per tutti i colori, tra cui RGB (127, 127, 127).

Quello che vi serve è 1) una conversione per HSV (vedi ThibThibs risposta) e invertire la tonalità, ma anche 2) verificare se la tonalità non è troppo vicino al centro e, se in modo da andare a uno completamente brillante o completamente scuro .

Se si desidera modificare ogni colore, provare una funzione di rotazione (spostamento o l'aggiunta) piuttosto che una funzione flipping (inversione). In altre parole, si consideri la gamma da 0 a 255 per ogni singolo colore (rosso, verde e blu) da avvolgere, collegato alle punte come un cerchio di valori. Poi sposta ogni colore intorno al cirle con l'aggiunta di un certo valore e facendo mod 256. Ad esempio, se il valore di partenza per il rosso è 255, e si aggiunge 1, si ottiene 0. Se si sposta tutti i tre colori del 128, si ottiene drammaticamente diverso valori per ogni colore originale nella foto, anche i grigi. Grey 127, 127, 127 diventa bianco 255, 255, 255. Grey 128, 128, 128 diventa nero 0, 0, 0. C'è un effetto fotografico del genere chiamato solarizzazione, scoperto per caso da Man Ray nel 1930.

È anche possibile fare operazioni di rotazione su ogni colore (rosso, verde, blu) per un importo diverso per davvero rovinare un quadro.

È anche possibile fare operazioni di rotazione a tonalità, spostando la tonalità di ogni colore originale di una certa quantità sul cerchio tonalità, che altera tutti i colori senza alterare la luminosità, in modo che le ombre ancora guardare come ombre, rendendo le persone sembrano Simpsons o Smurphs per esempio.

Il codice per uno spostamento del 128 potrebbe apparire come:

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

Il modo più semplice e pigro ho fatto funzionare con avere non solo triplo 12x, ma valori misti, è questo:

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

Ora, invertedColor ha un colore diverso che l'originale, anche se abbiamo un 128, 128, 128 o vicino ad esso valore di colore.

Ho creato questa semplice funzione per VB.NET:

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

E questo per C #:

public static Color Invert(Color Culoare)
{
    return Color.FromArgb(Culoare.ToArgb() ^ 0xFFFFFF);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top