it-swarm.com.de

Wie invertiere ich eine Farbe?

Ich weiß, dass dies eine Farbe nicht direkt umkehrt, sondern sie nur "ablehnt". Ich habe mich gefragt, ob jemand einen einfachen Weg (ein paar Zeilen Code) kannte, um eine Farbe von einer bestimmten Farbe umzukehren.

Im Moment habe ich dies (was nicht genau die Definition eines Invertes ist, denn wenn ich eine grau/graue Farbe übergebe, wird etwas extrem ähnliches zurückgegeben, z. B. 127, 127, 127):

const int RGBMAX = 255;

Color InvertMeAColour(Color ColourToInvert)
{
    return Color.FromArgb(RGBMAX - ColourToInvert.R, 
      RGBMAX - ColourToInvert.G, RGBMAX - ColourToInvert.B);
}
35
ThePower

Es hängt davon ab, was Sie unter "Invertieren" einer Farbe verstehen

Ihr Code bietet eine "negative" Farbe.

Suchen Sie nach Rot in Cyan, Grün in Lila, Blau in Gelb (und so weiter)? Wenn ja, müssen Sie Ihre RGB-Farbe im HSV Modus konvertieren (Sie finden hier , um die Transformation durchzuführen).

Dann müssen Sie nur den Farbtonwert invertieren (Hue durch 360-Hue ändern) und wieder in den RGB-Modus zurückkehren.

BEARBEITEN: Wie Alex Semeniuk erwähnt hat, ist das Ändern von Hue durch (Hue + 180) % 360 eine bessere Lösung (es invertiert nicht den Farbton, sondern findet die entgegengesetzte Farbe im Farbkreis).

47
ThibThib

Sie können verwenden:

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

Es wird MyColor invertieren.

17
Remy

Versuche dies:

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

Wenn Sie jede Farbe ändern möchten, versuchen Sie eine Rotationsfunktion (Verschieben oder Hinzufügen) anstelle einer Umkehrfunktion (Invertieren). Mit anderen Worten, betrachten Sie den Bereich von 0 bis 255 für jede einzelne Farbe (Rot, Grün und Blau), die umhüllt werden soll und an den Spitzen wie ein Wertekreis verbunden ist. Verschieben Sie dann jede Farbe um den Kreis, indem Sie einen Wert hinzufügen und Mod 256 ausführen. Wenn Ihr Startwert für Rot beispielsweise 255 ist und Sie 1 hinzufügen, erhalten Sie 0. Wenn Sie alle drei Farben um 128 verschieben, werden Sie dramatisch unterschiedlich Werte für jede Originalfarbe im Bild, auch für Grautöne. Grau 127, 127, 127 wird weiß 255, 255, 255. Grau 128, 128, 128 wird schwarz 0, 0, 0. Es gibt einen fotografischen Effekt wie den Namen Solarization, der von Man Ray in den 1930er Jahren zufällig entdeckt wurde.

Sie können auch Rotationsoperationen für jede Farbe (rot, grün, blau) um einen anderen Betrag ausführen, um ein Bild wirklich durcheinander zu bringen.

Sie können auch Rotationsoperationen für den Farbton durchführen, indem Sie den Farbton jeder Originalfarbe um einen bestimmten Betrag im Farbtonkreis verschieben. Dadurch werden alle Farben geändert, ohne dass die Helligkeit geändert wird. Die Schatten wirken wie Schatten, sodass die Menschen wie Simpsons oder Smurphs aussehen Beispiel.

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

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

Invertieren Sie die Bits jeder Komponente separat:

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

BEARBEITEN: Der Operator ~ arbeitet nicht automatisch mit Bytes, eine Umwandlung ist erforderlich.

5
Kenan E. K.

Was Sie bereits haben, ist ein RGB-Inverter. Es gibt andere Möglichkeiten, Farben zu klassifizieren und damit andere Definitionen für das Inverse einer Farbe. 

Aber es klingt, als würden Sie vielleicht eine kontrastierende Farbe haben, und es gibt keine einfache Inversion, die für alle Farben einschließlich RGB (127, 127, 127) geeignet ist. 

Was Sie brauchen, ist 1) eine Konvertierung in HSV (siehe ThibThibs Antwort) und invertiert den Farbton, aber auch 2) prüfen Sie, ob der Farbton nicht in der Nähe der Mitte liegt und ob dies der Fall ist, entweder ganz hell oder ganz dunkel. 

5
Henk Holterman

Die einfachste und faulste Art und Weise, mit der ich nicht nur dreifache 12x-Werte, sondern auch gemischte Werte erreicht habe, ist folgende:

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 hat invertedColor eine andere Farbe als das Original, auch wenn wir einen Farbwert von 128, 128, 128 oder in der Nähe davon haben.

1
Christos Lytras

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 für C #:

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