Frage

Ich weiß, dass dies nicht direkt eine Farbe umkehren wird, wird es nur ‚entgegenstellen‘ es. Ich habe mich gefragt, ob jemand eine einfache Art und Weise (ein paar Zeilen Code) kannte eine Farbe aus einer bestimmten Farbe zu invertieren?

Im Moment habe ich dies (die nicht genau die Definition eines Invert ist, denn wenn ich es ein grau / grau Farbe geben sie etwas sehr ähnlich zum Beispiel 127 zurück, 127, 127):

const int RGBMAX = 255;

Color InvertMeAColour(Color ColourToInvert)
{
    return Color.FromArgb(RGBMAX - ColourToInvert.R, 
      RGBMAX - ColourToInvert.G, RGBMAX - ColourToInvert.B);
}
War es hilfreich?

Lösung

Es hängt davon ab, was meinst du mit „Invertierung“ eine Farbe

Der Code stellt eine "negative" Farbe.

Suchen Sie in gelb in cyan, grün in violett, blau rot-Transformation (und so weiter)? Wenn ja, müssen Sie Ihre RGB-Farbe in HSV Modus konvertieren (Sie werden feststellen, hier zu machen die Transformation).

Dann brauchen Sie nur den Farbtonwert (Veränderung Hue von 360-Hue) zu invertieren und konvertieren zurück in den RGB-Modus.

EDIT: wie Alex Semeniuk erwähnt, Hue durch (Hue + 180) % 360 Veränderung ist eine bessere Lösung (es nicht den Farbton, die nicht umkehren, aber die entgegengesetzte Farbe auf dem Farbkreis finden)

Andere Tipps

Sie können mit:

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

Es wird invertieren MyColor.

Versuchen Sie folgendes:

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

die Bits jeder Komponente separat:

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

EDIT:. Der Operator ~ funktioniert nicht mit automatisch Bytes wird gegossen benötigt

Was Sie schon haben, ist eine RGB-Invert. Es gibt auch andere Möglichkeiten, Farben und damit andere Definitionen für die Inverse einer Farbe zu klassifizieren.

Aber es klingt wie vielleicht haben Sie eine Kontrastfarbe wollen, und es gibt keine einfache Inversion, die für alle Farben einschließlich RGB (127, 127, 127) arbeiten wird.

Was müssen Sie 1) eine Umwandlung in HSV (siehe ThibThibs Antwort) und invertieren die Hue, aber auch 2) überprüfen, ob der Farbton in die Mitte nicht zu schließen ist und wenn ja, geht entweder vollständig hell oder vollständig dunkel .

Wenn Sie jede Farbe ändern möchten, versuchen, eine Drehfunktion (Verschieben oder Hinzufügen), anstatt eine Flipping Funktion (inverted). Mit anderen Worten, sollten Sie den Bereich von 0 bis 255 für jede einzelne Farbe (rot, grün und blau) gewickelt, an den Spitzen wie ein Kreis von Werten verbunden werden. Dann verschieben jede Farbe um den cirle durch einen gewissen Wert hinzufügen und mod 256. Zum Beispiel tun, wenn Ihr Startwert für Rot 255 ist, und du 1, Sie 0. bekommen Wenn Sie alle drei Farben von 128 verschieben, erhalten Sie dramatisch anders Werte für jede ursprüngliche Farbe im Bild, auch die Grautöne. 127 Gray, 127, 127 wird weiß 255, 255, 255. Grau 128, 128, 128 wird schwarz 0, 0, 0. Es gibt eine fotografische Wirkung wie die genannte Solarisation, zufällig von Man Ray in den 1930er Jahren entdeckt.

können Sie tun auch Drehoperationen auf jeder Farbe (rot, grün, blau) um einen anderen Betrag, um wirklich mess up ein Bild.

können Sie tun auch Drehoperationen auf Farbton, um einen gewissen Betrag auf dem Bunttonkreis den Farbton eines jeden ursprünglichen Farbverschiebung, die ohne Änderung der Helligkeit alle Farben verändert, so noch die Schatten wie Schatten sehen, Leute wie Simpsons machen aussehen oder Smurphs zum Beispiel.

Der Code für eine Verschiebung um 128 aussehen könnte:

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

Die einfachste und faul wie ich es mit, die nicht nur triple 12x, sondern gemischte Werte zu arbeiten gemacht, ist dies:

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

Nun invertedColor hat eine andere Farbe, die das Original, auch wenn wir ein 128, 128, 128 oder nahe daran Farbwert.

Ich habe diese einfache Funktion für VB.NET erstellt:

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

Und dies ist für C #:

public static Color Invert(Color Culoare)
{
    return Color.FromArgb(Culoare.ToArgb() ^ 0xFFFFFF);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top