Question

Je sais que ce ne sera pas inverser directement une couleur, il va juste « s'opposer » il. Je me demandais si quelqu'un connaissait un moyen simple (quelques lignes de code) pour inverser une couleur de toute couleur donnée?

En ce moment j'ai ce (qui est pas exactement la définition d'un inverti, parce que si je passe une couleur gris / gris, il retournera quelque chose de très similaire par exemple 127, 127, 127):

const int RGBMAX = 255;

Color InvertMeAColour(Color ColourToInvert)
{
    return Color.FromArgb(RGBMAX - ColourToInvert.R, 
      RGBMAX - ColourToInvert.G, RGBMAX - ColourToInvert.B);
}
Était-ce utile?

La solution

Cela dépend de ce que vous entendez par « inversion » une couleur

Votre code fournit une couleur "négative".

Vous cherchez transformer en rouge cyan, vert violet, bleu en jaune (et ainsi de suite)? Si oui, vous devez convertir votre couleur RVB en mode HSV (vous trouverez rel="noreferrer"> ici pour faire la transformation).

Ensuite, vous avez juste besoin d'inverser la valeur Hue (changement Hue par 360-Hue) et reconvertir en mode RVB.

EDIT: comme l'a mentionné Alex Semeniuk, changeant Hue par (Hue + 180) % 360 est une meilleure solution (ne pas inverser la teinte, mais trouver la couleur opposée sur le cercle de couleur)

Autres conseils

Vous pouvez utiliser:

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

Il inversera MyColor.

Essayez ceci:

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

inverser les bits de chaque composant séparément:

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

EDIT:. L'opérateur ~ ne fonctionne pas avec des octets automatiquement, cast est nécessaire

Qu'est-ce que vous avez déjà est un RGB-inverti. Il existe d'autres façons de classer les couleurs et donc d'autres définitions pour l'inverse d'une couleur.

Mais il semble que peut-être vous voulez une couleur contrastante, et il n'y a pas d'un simple qui va inversion travailler pour toutes les couleurs, y compris RGB (127, 127, 127).

Qu'est-ce que vous avez besoin est 1) une conversion à HSV (voir ThibThibs réponse) et inverser la teinte, mais aussi 2) vérifier si la teinte est de ne pas fermer au milieu et si oui, aller soit complètement clair ou totalement sombre .

Si vous voulez changer toutes les couleurs, essayez une fonction de rotation (déplacement ou l'ajout) plutôt que d'une fonction de basculement (inversion). En d'autres termes, pensez à la plage de 0 à 255 pour chaque couleur (rouge, vert et bleu) à emballer, connecté aux extrémités comme un cercle de valeurs. Déplacez ensuite chaque couleur autour de la cirle en ajoutant une valeur et faire mod 256. Par exemple, si votre valeur de départ pour le rouge est de 255, et que vous ajoutez 1, vous obtenez 0. Si vous passez trois couleurs par 128, vous obtenez radicalement différent valeurs pour toutes les couleurs d'origine dans l'image, même les gris. Gris 127, 127, 127 devient blanc 255, 255, 255. gris 128, 128, 128 devient noir 0, 0, 0. Il y a un effet photographique comme celui appelé solarisation, découvert par hasard par Man Ray dans les années 1930.

Vous pouvez également effectuer des opérations de rotation sur chaque couleur (rouge, vert, bleu) par un montant différent pour vraiment gâcher une image.

Vous pouvez également effectuer des opérations de rotation sur la teinte, le déplacement de la teinte de toutes les couleurs d'origine par une certaine quantité sur le cercle chromatique, qui modifie toutes les couleurs sans altérer la luminosité, de sorte que les ombres sont encore comme des ombres, ce qui rend les gens ressemblent à Simpsons ou Smurphs par exemple.

Le code pour un changement de 128 pourrait ressembler à:

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

La façon la plus simple et paresseux je l'ai fait de travailler avec non seulement avoir trois 12x, mais les valeurs mixtes, est la suivante:

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

Maintenant, invertedColor a une couleur différente que l'original, même si nous avons 128, 128, 128 ou à peu près la valeur de couleur.

J'ai créé cette fonction simple pour VB.NET:

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

Et celui-ci pour C #:

public static Color Invert(Color Culoare)
{
    return Color.FromArgb(Culoare.ToArgb() ^ 0xFFFFFF);
}
scroll top