ठीक है, यह अभी भी सबसे अच्छा संभव समाधान नहीं है, लेकिन शुरू करने के लिए एक अच्छा बिंदु है। मैंने थोड़ा जावा ऐप लिखा है जो दो रंगों के विपरीत अनुपात की गणना करता है और केवल 5: 1 या बेहतर के अनुपात के साथ रंगों को संसाधित करता है - यह अनुपात और मेरे द्वारा उपयोग किया गया सूत्र W3C द्वारा जारी किया गया है और संभवतः वर्तमान अनुशंसा को प्रतिस्थापित करेगा (जो मैं बहुत सीमित मानता हूं)। यह "चुनी-फॉन्ट-कलर्स.html" नाम के मौजूदा वर्किंग डायर में एक फाइल बनाता है, जिसमें आपकी पसंद का बैकग्राउंड कलर और हर कलर में टेक्स्ट की एक लाइन होती है जो इस W3C टेस्ट को पास करती है। यह एक ही तर्क की उम्मीद करता है, पृष्ठभूमि का रंग होना।
जैसे आप इसे इस तरह कह सकते हैं
java FontColorChooser 33FFB4
फिर अपनी पसंद के ब्राउज़र में जेनरेट की गई HTML फ़ाइल खोलें और सूची में से एक रंग चुनें। दिए गए सभी रंगों ने इस पृष्ठभूमि के रंग के लिए W3C टेस्ट पास किया। आप अपनी पसंद की संख्या के साथ 5 को बदलकर कट ऑफ को बदल सकते हैं (कम संख्या कमजोर विरोधाभासों की अनुमति देती है, उदाहरण के लिए 3 केवल यह सुनिश्चित करेगा कि कंट्रास्ट 3: 1 है, 10 यह सुनिश्चित करेगा कि यह कम से कम 10: 1 है) और आप भी कर सकते हैं बहुत अधिक विरोधाभासों से बचने के लिए काट दिया गया (यह निश्चित संख्या से छोटा है), उदाहरण के लिए
|| cDiff > 18.0
अगर क्लॉज सुनिश्चित करेगा कि कंट्रास्ट बहुत ज्यादा चरम नहीं होगा, क्योंकि बहुत ज्यादा कंट्रास्ट आपकी आंखों को तनाव दे सकता है। यहाँ कोड है और यह एक बिट के साथ चारों ओर खेल मज़ा है :-)
import java.io.*;
/* For text being readable, it must have a good contrast difference. Why?
* Your eye has receptors for brightness and receptors for each of the colors
* red, green and blue. However, it has much more receptors for brightness
* than for color. If you only change the color, but both colors have the
* same contrast, your eye must distinguish fore- and background by the
* color only and this stresses the brain a lot over the time, because it
* can only use the very small amount of signals it gets from the color
* receptors, since the breightness receptors won't note a difference.
* Actually contrast is so much more important than color that you don't
* have to change the color at all. E.g. light red on dark red reads nicely
* even though both are the same color, red.
*/
public class FontColorChooser {
int bred;
int bgreen;
int bblue;
public FontColorChooser(String hexColor) throws NumberFormatException {
int i;
i = Integer.parseInt(hexColor, 16);
bred = (i >> 16);
bgreen = (i >> 8) & 0xFF;
bblue = i & 0xFF;
}
public static void main(String[] args) {
FontColorChooser fcc;
if (args.length == 0) {
System.out.println("Missing argument!");
System.out.println(
"The first argument must be the background" +
"color in hex notation."
);
System.out.println(
"E.g. \"FFFFFF\" for white or \"000000\" for black."
);
return;
}
try {
fcc = new FontColorChooser(args[0]);
} catch (Exception e) {
System.out.println(
args[0] + " is no valid hex color!"
);
return;
}
try {
fcc.start();
} catch (IOException e) {
System.out.println("Failed to write output file!");
}
}
public void start() throws IOException {
int r;
int b;
int g;
OutputStreamWriter out;
out = new OutputStreamWriter(
new FileOutputStream("chosen-font-colors.html"),
"UTF-8"
);
// simple, not W3C comform (most browsers won't care), HTML header
out.write("<html><head><title>\n");
out.write("</title><style type=\"text/css\">\n");
out.write("body { background-color:#");
out.write(rgb2hex(bred, bgreen, bblue));
out.write("; }\n</style></head>\n<body>\n");
// try 4096 colors
for (r = 0; r <= 15; r++) {
for (g = 0; g <= 15; g++) {
for (b = 0; b <= 15; b++) {
int red;
int blue;
int green;
double cDiff;
// brightness increasse like this: 00, 11,22, ..., ff
red = (r << 4) | r;
blue = (b << 4) | b;
green = (g << 4) | g;
cDiff = contrastDiff(
red, green, blue,
bred, bgreen, bblue
);
if (cDiff < 5.0) continue;
writeDiv(red, green, blue, out);
}
}
}
// finalize HTML document
out.write("</body></html>");
out.close();
}
private void writeDiv(int r, int g, int b, OutputStreamWriter out)
throws IOException
{
String hex;
hex = rgb2hex(r, g, b);
out.write("<div style=\"color:#" + hex + "\">");
out.write("This is a sample text for color " + hex + "</div>\n");
}
private double contrastDiff(
int r1, int g1, int b1, int r2, int g2, int b2
) {
double l1;
double l2;
l1 = (
0.2126 * Math.pow((double)r1/255.0, 2.2) +
0.7152 * Math.pow((double)g1/255.0, 2.2) +
0.0722 * Math.pow((double)b1/255.0, 2.2) +
0.05
);
l2 = (
0.2126 * Math.pow((double)r2/255.0, 2.2) +
0.7152 * Math.pow((double)g2/255.0, 2.2) +
0.0722 * Math.pow((double)b2/255.0, 2.2) +
0.05
);
return (l1 > l2) ? (l1 / l2) : (l2 / l1);
}
private String rgb2hex(int r, int g, int b) {
String rs = Integer.toHexString(r);
String gs = Integer.toHexString(g);
String bs = Integer.toHexString(b);
if (rs.length() == 1) rs = "0" + rs;
if (gs.length() == 1) gs = "0" + gs;
if (bs.length() == 1) bs = "0" + bs;
return (rs + gs + bs);
}
}