Domanda

Non sono sicuro di come chiederlo, ma qui va.

Traccio sullo schermo un rettangolo colorato pieno. Il colore è in forma di R, G, B

Voglio quindi disegnare il testo sopra il rettangolo, tuttavia il colore del testo deve essere tale da fornire il miglior contrasto, nel senso che è leggibile.

Esempio:

Se disegno un rettangolo nero, il colore ovvio per il testo sarebbe bianco.

Quello che ho provato in questo momento è questo. Passo questa funzione al colore del rettangolo e restituisce un colore invertito che poi uso per il mio testo.

Funziona, ma non è il modo migliore.

Qualche suggerimento?

// eg. usage: Color textColor = GetInverseLuminance(rectColor);
private Color GetInverseLuminance(Color color)
{
    int greyscale = (int)(255 - ((color.R * 0.30f) + (color.G * 0.59f) + (color.B * 0.11f)));

    return Color.FromArgb(greyscale, greyscale, greyscale);
}
È stato utile?

Soluzione

Un approccio semplice che è garantito per dare un colore significativamente diverso è quello di attivare il bit superiore di ciascun componente della tripla RGB.

Color inverse(Color c)
{
    return new Color(c.R ^ 0x80, c.G ^ 0x80, c.B ^ 0x80);
}

Se il colore originale era # 1AF283, "inverso" sarà # 9A7203.

Il contrasto sarà significativo. Non garantisco l'estetica.

Aggiornamento, 2009/4/3: ho sperimentato questo e altri schemi. Risultati su il mio blog .

Altri suggerimenti

Il colore più leggibile sarà bianco o nero. Il colore più 'rilassante' sarà qualcosa che non è bianco né nero, sarà un colore che contrasta leggermente con il colore di sfondo. Non c'è modo di farlo a livello di programmazione perché è soggettivo. Non troverai il colore più leggibile per tutti perché tutti vedono le cose in modo diverso.

Alcuni consigli sul colore, in particolare sulla giustapposizione di primo piano e sfondo, come nel caso del testo.

L'occhio umano è essenzialmente una lente semplice e quindi può focalizzare efficacemente solo un colore alla volta. Gli obiettivi utilizzati nella maggior parte delle fotocamere moderne risolvono questo problema utilizzando più obiettivi con diversi indici di rifrazione (lenti cromatiche) in modo che tutti i colori siano a fuoco contemporaneamente, ma l'occhio umano non è così avanzato.

Per questo motivo, i tuoi utenti dovrebbero solo concentrarsi su un colore alla volta per leggere il testo. Ciò significa che il primo piano è a colori o lo sfondo, ma mai entrambi. Ciò porta a una condizione tipicamente chiamata vibrazione, in cui l'occhio sposta rapidamente la messa a fuoco tra i colori di primo piano e di sfondo, cercando di risolvere la forma, ma non si risolve mai, la forma non è mai a fuoco e porta ad affaticamento degli occhi.

La tua funzione non funzionerà se la fornisci con RGB (127.127.127), perché restituirà lo stesso identico colore. (la modifica della funzione per restituire il bianco o il nero migliorerebbe leggermente le cose)

Il modo migliore per avere sempre cose leggibili è di avere del testo bianco con il nero intorno, o viceversa.

Spesso si ottiene disegnando prima il testo nero in (x-1, y-1), (x + 1, y-1), (x + 1, y-1), (x + 1, x + 1 ), quindi testo bianco in (x, y).

In alternativa, puoi prima disegnare un blocco nero semitrasparente, quindi un testo bianco non trasparente su di esso. Ciò garantisce che ci sarà sempre un certo contrasto tra lo sfondo e il testo.

perché grigio? il bianco o il nero sarebbe il migliore. bianco su colori scuri, nero su colori chiari. basta vedere se la luminanza è al di sopra di una soglia e scegliere l'una o l'altra

(non hai bisogno dei tag .net, c # o asp.net, comunque)

Devi studiare una teoria del colore. Un programma chiamato " Color Wheel Pro " è divertente da giocare e ti darà l'idea generale.

In sostanza, stai cercando colori complementari per un determinato colore.

Detto questo, penso che scoprirai che mentre la teoria del colore aiuta, hai ancora bisogno di un occhio umano per mettere a punto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top