Se si desidera cambiare ogni colore, provare una funzione di rotazione (spostamento o aggiunta) piuttosto che una funzione di inversione (invertendo). In altre parole, considera l'intervallo da 0 a 255 per ogni singolo colore (rosso, verde e blu) da avvolgere, collegato alle punte come un cerchio di valori. Quindi sposta ciascun colore attorno al cerchio aggiungendo un valore e facendo mod 256. Ad esempio, se il tuo valore iniziale per il rosso è 255 e aggiungi 1, ottieni 0. Se sposti tutti e tre i colori per 128, diventi drammaticamente diverso valori per ogni colore originale nell'immagine, anche i grigi. Grigio 127, 127, 127 diventa bianco 255, 255, 255. Grigio 128, 128, 128 diventa nero 0, 0, 0. C'è un effetto fotografico come quello chiamato Solarizzazione, scoperto per caso da Man Ray negli anni '30.
È inoltre possibile eseguire operazioni di rotazione su ciascun colore (rosso, verde, blu) di una quantità diversa per incasinare realmente un'immagine.
È anche possibile fare operazioni di rotazione di Hue, 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 guardano ancora come ombre, rendendo le persone assomigliare Simpson o Smurphs per esempio.
Il codice per uno spostamento di 128 potrebbe sembrare:
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);
}
}
In realtà, questo * è * il modo in cui viene in genere definito l'inversione di un colore ... cosa stai cercando invece? –
E se il mio colore fosse 127, 127, 127, passando per la mia funzione non lo invertirai .. – ThePower
Forse hai bisogno di generare un colore di sfondo su cui il tuo colore sarà leggibile? –