2011-01-12 7 views
9

Ho una configurazione utente in cui possono scegliere i colori degli avvisi. l'avviso è il colore di sfondo su un testo o un pulsante. Ma il problema è che se selezionano un blu scuro e abbiamo lettere nere, il contrasto non è sufficiente e non puoi leggerlo.Colori opposti opposti

Ho provato a fare una funzione per ottenere il contrario del colore opposto, ma non è arrivato troppo lontano.

Esiste una tale funzione?

+1

Ci sono almeno due domande qui per questo. Uno è http://stackoverflow.com/questions/596216/formula-to-determine-brightness-of-rgb-color. Lo so perché ho implementato un algoritmo da uno di essi e funziona bene. – Nemi

risposta

0

È possibile calcolare la differenza tra ciascun canale di colore (rosso, verde e blu) e ottenere la differenza media, quindi eseguire un confronto basato su quello.

1

Il testo deve essere un colore derivato dal colore di sfondo? Cosa succede se si alterna solo tra bianco e nero in base all'intensità di r g b? L'idea è che il bianco sarà sempre visibile su valori r g b inferiori ad una certa intensità e il nero sempre visibile sul resto.

Non ho un algoritmo di lavoro per condividere, ma si potrebbe provare qualcosa sulla falsariga di:

int threshold = 50; 
if(r < threshold && g < threshold && b < threshold) { 
    // set your font color to white 
} else { 
    // set your font color to black 
} 

Probabilmente dovrete armeggiare con soglia un po 'per ottenere qualcosa di bello. È anche possibile colorare leggermente il carattere in base al valore di rgb dominante.

13

Uso complementary color:

Algo è semplice, sottrarre ogni componente di colore da 255 a ottenere nuovi componenti di colore

Color textColor = Color.rgb(255-Color.red(bgColor), 
         255-Color.green(bgColor), 
         255-Color.blue(bgColor)); 

----- EDIT (complemento Come base RGB non può funzionare sempre - ------

Questi due collegamenti sono molto utili e sul tema:

http://www.splitbrain.org/blog/2008-09/18-calculating_color_contrast_with_php

http://24ways.org/2010/calculating-color-contrast

+5

Questo non rappresenta un grosso problema quando l'utente seleziona il colore 128/128/128 (o qualcosa di molto vicino). – Anthony

+0

Ho incluso un link da Wikipedia nella risposta. Il complemento basato su RGB è più facile da capire. Il complemento basato su HSV funzionerà in questo caso. @Shynhriir: Sì. Il complemento basato su RGB non funzionerà in questo intervallo, hai perfettamente ragione. –

+0

Come codificheresti su Android il colore complementare dal collegamento Wiki? –

2

ho ottenuto che funziona, credo :)

Qui è la funzione:

public static int OpposeColor(int ColorToInvert) 
{ 
    int RGBMAX = 255; 

    float[] hsv = new float[3]; 
    float H; 

    Log.i("HSV_H", "Start Color=" + ColorToInvert); 

    Color.RGBToHSV(Color.red(ColorToInvert), RGBMAX - Color.green(ColorToInvert), Color.blue(ColorToInvert), hsv); 

    Log.i("HSV_H", "Hue=" + hsv[0]); 
    Log.i("HSV_H", "Saturation=" + hsv[1]); 
    Log.i("HSV_H", "Value=" + hsv[2]); 

    H = (float) (hsv[0] + 0.5); 

    if (H > 1) H -= 1; 

    Log.i("HSV_H", "Hue2=" + H);   

    Log.i("HSV_H", "Color=" + Color.HSVToColor(hsv)); 

    return Color.HSVToColor(hsv); 


} 
+0

perché "RGBMAX -"? e la tonalità è un valore compreso tra 0 e 360 ​​e non 0 e 1, penso, ho postato una versione aggiornata sotto –

17

Ho trovato che la soluzione migliore per me è quello di convertire i valori RGB in valori YIQ . Dato che siamo interessati solo al valore di luminosità (rappresentato da Y), è necessario eseguire un singolo calcolo: Y = (299*R + 587*G + 114*B)/1000. Il codice Java per che sarebbe simile a questa:

public static Color getContrastColor(Color color) { 
    double y = (299 * color.getRed() + 587 * color.getGreen() + 114 * color.getBlue())/1000; 
    return y >= 128 ? Color.black : Color.white; 
} 

Si può vedere che decide semplicemente di usare nero o bianco, in base alla luminosità del colore originale. E il risultato funziona molto bene secondo me. I pesi (299, 587, 114) sono proporzionali alla sensibilità degli occhi (o piuttosto alla sensibilità della retina) al colore corrispondente.

+1

Grazie. Questo potrebbe non coprire tutti i casi, ma è perfetto per il mio caso (rendere leggibile il testo su uno sfondo colorato) –

+0

Puoi sempre leggere il testo piuttosto bene. Lo svantaggio è che il testo sarà bianco o nero, le informazioni sul colore dello sfondo sono "perse". – brimborium

6

Sulla base di soluzione Marks vorrei suggerire:

public static int getComplementaryColor(int colorToInvert) { 
    float[] hsv = new float[3]; 
    Color.RGBToHSV(Color.red(colorToInvert), Color.green(colorToInvert), 
      Color.blue(colorToInvert), hsv); 
    hsv[0] = (hsv[0] + 180) % 360; 
    return Color.HSVToColor(hsv); 
} 

E inoltre ora ho creato un metodo simile, per il calcolo di uno sfondo predefinito per un determinato colore: soluzione

public static int getContrastVersionForColor(int color) { 
    float[] hsv = new float[3]; 
    Color.RGBToHSV(Color.red(color), Color.green(color), Color.blue(color), 
      hsv); 
    if (hsv[2] < 0.5) { 
     hsv[2] = 0.7f; 
    } else { 
     hsv[2] = 0.3f; 
    } 
    hsv[1] = hsv[1] * 0.2f; 
    return Color.HSVToColor(hsv); 
} 
+0

You 'getComplementaryColor' funziona perfettamente ma non 'getContrastVersionForColor' puoi per favore risolvere? –

+0

Cosa vuoi dire che non funziona? Non ti piace il risultato? Puoi fornire un valore int per il colore per il quale non sembra corretto? Lo uso abbastanza spesso e non ho mai avuto problemi –

3

intero:

public static int getContrastColor(int color) { 
     double y = (299 * Color.red(color) + 587 * Color.green(color) + 114 * Color.blue(color))/1000; 
     return y >= 128 ? Color.BLACK : Color.WHITE; 
    } 
+1

Puoi spiegare per favore come risolverebbe il problema? – Phani

+0

"Ho cercato di fare una funzione per ottenere il contrario di colore opposto ma non ha avuto troppo tempo." Quindi ecco una funzione ^^ restituisce il colore nero o bianco. – Eboo

+0

Tornando alla prima domanda ... se non risolve il problema ... allora cancella ... o aggiorna la domanda con gli ultimi risultati. – Phani