2010-02-11 14 views
31

So etwas wie die Berechnung des Durchschnittswerts von RGB-Komponenten und dann entscheiden, ob Schwarz oder Weiß zu verwenden?Machen Sie Vordergrundfarbe schwarz oder weiß abhängig vom Hintergrund

Muss ich im ersten Schritt RGB in HSV konvertieren, weil RGB nicht immer das ist, was das menschliche Auge sieht?

Ich bin mit C#

+2

Diese Frage enthält Antworten, die Ihnen helfen werden: http://stackoverflow.com/questions/946544/good-text-foreground-color-for-a-given-background-color/946570 –

+0

Verwandte (aber Duples selbst) : http://stackoverflow.com/questions/3116260/given-a-background-color-how-to-geta-a-foreground-color-that-make-it-readable-on http://stackoverflow.com/ Fragen/3942878/how-to-decide-font-color-in-white-oder-black-je-on-Hintergrund-Farbe – JYelton

Antwort

3

was ist das?

+1

Versuchen Sie dies mit den folgenden Werten: 128, 255, 0. Es ist ein hellgrün, das leichter vor einem schwarzen Hintergrund zu lesen ist. Der Durchschnittswert ist jedoch 127, für den Ihre Methode Weiß zurückgibt. – JYelton

0

Sie könnten eine einfache Berechnung tun, je nach Farbtiefe, wenn Sie sagen, ein #FFFFFF Farbe Format hatte, konnte man nur die RGB-Werte addieren und berechnen, wenn sie weniger als die Hälfte Weg sind .

Der max in diesem Fall 255 (F x F = 256) pro, also nur prüfen, ob es unter dieser Schwelle ist:

var colorCode = ((R + B + G) < 255*3) ? "#FFFFFF" : "#000000"; 

Wenn die Farbe unten ist, ist es dunkler ist ... verwenden, um einen weißen Hintergrund . Wenn es oben ist, ist es leichter ... verwende einen schwarzen Hintergrund. Es ist nicht perfekt, aber eine Idee, um loszulegen.

+0

Ich versuchte so etwas ursprünglich in meinem Projekt, und es führte zu einigen Gelegenheiten, wo die weiße/Schwarze Etiketten waren gegenüber ihren Hintergrundfarben nicht so auffällig. – JYelton

59

Es passiert einfach, ich brauchte diese Funktion für ein Projekt vor nicht allzu langer Zeit.

private int PerceivedBrightness(Color c) 
{ 
    return (int)Math.Sqrt(
    c.R * c.R * .241 + 
    c.G * c.G * .691 + 
    c.B * c.B * .068); 
} 

Diese Formel I im Internet unter Nbd Tech gefunden, die mit wahrgenommen Farben und Farbumrechnungsformel behandelt. Die Website bietet viele hilfreiche Informationen.

Hier ist, wie diese zu verwenden, schwarz oder weiß wählen:

var foreColor = (PerceivedBrightness(backColor) > 130 ? Color.Black : Color.White); 

Sie einen anderen Wert als 130, wie der Cutoff verwenden können; Es ist Vorliebe.


Update: Nach Darel Rex Finley bei his site:

Die Werte kam ich mit nach oben, indem sie mit Photoshop tatsächlich spielen 0,241 wurden, 0,691 und 0,068, aber ich habe seit informiert worden, dass die Werte .299, .587 und .114 genauer sind.

Diese Spezifikation folgt ITU-R Recommendation BT.601 (oder kurz Rec. 601). Die Seite, die ich oben erwähnt habe, Nbd Tech, wurde noch nicht aktualisiert, um dies widerzuspiegeln.

auf dieser Grundlage ist hier die aktualisierten Methode (dank DTI-Matt für den Kommentar):

private int PerceivedBrightness(Color c) 
{ 
    return (int)Math.Sqrt(
    c.R * c.R * .299 + 
    c.G * c.G * .587 + 
    c.B * c.B * .114); 
} 

Hinweis auf Schwellen preference:

Farben mit einer wahrgenommenen Helligkeit in der Nähe von die Mitte (zB 120-140) wird subjektiver sein. Es ist zum Beispiel fraglich, ob Rot (FF0000), das zu 139 ausgewertet wird, mit einer schwarzen oder weißen Überlagerung klarer ist.

White and Black on Red

+0

Dies ist im Grunde die Formel für Luma, Quadraturwerte, um Ausreißern mehr Gewicht zu geben. Das Ergebnis ist eine 0-255-Skala. http://en.wikipedia.org/wiki/Luma_%28video%29 –

+2

** HINWEIS: ** Die Quelle für diese Werte wurde aktualisiert: http://alienrderflex.com/hsp.html Sie werden jetzt angezeigt wie: 'R: .299'' G: .587' 'B: .114' –

+0

@DTI Danke für den Tipp, ich habe die Antwort aktualisiert. – JYelton

-1

Wenn ich richtig zu verstehen, könnte ein Ansatz halten, das Desktop-Hintergrund Bild zu bekommen sein, überprüfen Sie in einigen Herren, welche Farbe es ist, und dann Ihre Anwendung Farbe auf dieser Grundlage ändern.

Es ist ein Artikel on geekpedia über hält den aktuellen Desktop-Hintergrund bekommen (und viele Zugriffe auf Google auf dem), aber der Grundgedanke ist, den Registrierungswert der aktuellen Tapete zu greifen:

RegistryKey rkWallPaper = Registry.CurrentUser.OpenSubKey("Control Panel\\Desktop", false); 
string WallpaperPath = rkWallPaper.GetValue("WallPaper").ToString(); 

Sie könnte dann diesen Pfad verwenden, um das Bild zu öffnen. Sie können dann viele Eigenschaften wie die Abmessungen und individuelle Pixelfarben in RGB erhalten.

Um herauszufinden, ob es "mehr weiß" oder "mehr schwarz" ist, haben Sie viele Möglichkeiten.

Eine Idee wäre, jede Pixelfarbe in RGB zu erhalten, die Werte zu mitteln (um den Graustufenwert zu erhalten) und dann den Grauwert jedes Pixels über das Bild zu mitteln. Wenn dies> 128 herauskommt, könnte es als "weiß" angesehen werden. Wenn < 128 dann "schwarz". Grundsätzlich entscheiden Sie, auf welcher Seite der mittleren grauen Trennlinie sich die Bildpixelintensitäten ausmitteln.

// Psudo code - can't check the C# spec atm. 
foreach(Pixel p in image) 
{ 
    // get average of colour components. 
    double greyScale = (p.Red + p.Green + p.Blue)/3; 
    totalIntensity += greyScale; 
} 

double averageImageIntensity = totalIntensity/image.NumPixels; 

if(totalIntensity > 128) // image could be considered to be "white" 
else // image could be considered "black". 

Probleme: könnte ein langsamer Vorgang sein, könnten Sie nur einen Teil der Pixel (etwa jeder 10. ein etc.) um Zeit zu sparen probieren möchten. Im Allgemeinen scheint es, als wäre es ein ziemlich hacky Sache überhaupt zu tun. Das Ziehen von Benutzerdateien zur Laufzeit und das Durcheinander mit ihnen ist kaum sauber und bietet potenzielle Sicherheits- und Stabilitätsprobleme. Was ist, wenn das Bild duff oder beschädigt ist?

Persönlich würde ich vorschlagen, einfach dem Benutzer die Wahl der Farbe/Thema/Haut selbst zu geben, oder besser noch lassen Sie sie anpassen!

+0

Ich möchte nicht die gesamte App Farbe ändern. Ich verwende eine Listenansicht, in der Artikel bg Farbe haben und der Text jedes Artikels lesbar sein soll ... – Kai

3

Die Struktur unterstützt die native Konvertierung in HSB.

Sie können auch eine Komponente der Sättigung hinzufügen, wobei die Sättigung auch zur scheinbaren "Helligkeit" beiträgt.

Verwandte Themen