我試圖找到一種方法來確定是否使用黑色或白色文本,給定背景顏色(作爲十六進制值)。有沒有人處理過這個?有沒有一種有效的方法來做到這一點?給定背景顏色,黑色或白色文本?
在我的情況下,我會使用PHP來實現邏輯(儘管任何在其他語言中的經驗都是值得歡迎的)。
我試圖找到一種方法來確定是否使用黑色或白色文本,給定背景顏色(作爲十六進制值)。有沒有人處理過這個?有沒有一種有效的方法來做到這一點?給定背景顏色,黑色或白色文本?
在我的情況下,我會使用PHP來實現邏輯(儘管任何在其他語言中的經驗都是值得歡迎的)。
看看這個頁面:Calculating Color Contrast with PHP
請記住,如果黑色和白色是你唯一的選擇,你肯定會有情況下,他們都沒有工作特別大。
一個簡單但並不完美的解決方案是對各個組件(RGB)進行求和,並將這個值越大'顏色越淺'。因此,對於高價值,您可以使用黑色作爲前景,而對於較低的值,可以使用白色。
然後,您可以改進此方法,爲灰度色(R = G = B)製作特定情況,除非是深灰色,否則不會很好地顯示白色文本。
編輯:當然,這意味着你需要知道的RGB存儲在你的十六進制值的格式,標準的24 bpp的存儲是0x00RRGGBB爲8個十六進制數字。
我會計算rgb組件的平均值,然後決定是否使用黑色或白色,例如白高達0x66
這裏是一個可以用來計算你的文字的亮度對比度的算法:
http://juicystudio.com/services/aertcolourcontrast.php
你可以使用這個公式有白色和黑色的值來計算它給你更高的比例,從而更可讀的文字。
你應該看看the CSS Color library。它是用PHP實現的,爲你做了所有的艱苦工作。
function getTextColour($hex){
list($red, $green, $blue) = sscanf($hex, "#%02x%02x%02x");
$luma = ($red + $green + $blue)/3;
if ($luma < 128){
$textcolour = "white";
}else{
$textcolour = "black";
}
return $textcolour;
}
我認爲最好的辦法是Luminosity Contrast
算法:
提醒:下一個功能效果很好的大部分時間,但有時也有顏色,它不工作正常。
public function getContrastColor($hexColor) {
//////////// hexColor RGB
$R1 = hexdec(substr($hexColor, 0, 2));
$G1 = hexdec(substr($hexColor, 2, 2));
$B1 = hexdec(substr($hexColor, 4, 2));
//////////// Black RGB
$blackColor = "#000000";
$R2BlackColor = hexdec(substr($blackColor, 0, 2));
$G2BlackColor = hexdec(substr($blackColor, 2, 2));
$B2BlackColor = hexdec(substr($blackColor, 4, 2));
//////////// Calc contrast ratio
$L1 = 0.2126 * pow($R1/255, 2.2) +
0.7152 * pow($G1/255, 2.2) +
0.0722 * pow($B1/255, 2.2);
$L2 = 0.2126 * pow($R2BlackColor/255, 2.2) +
0.7152 * pow($G2BlackColor/255, 2.2) +
0.0722 * pow($B2BlackColor/255, 2.2);
$contrastRatio = 0;
if ($L1 > $L2) {
$contrastRatio = (int)(($L1 + 0.05)/($L2 + 0.05));
} else {
$contrastRatio = (int)(($L2 + 0.05)/($L1 + 0.05));
}
//////////// If contrast is more than 5, return black color
if ($contrastRatio > 5) {
return 'black';
} else { //////////// if not, return white color.
return 'white';
}
}
一些結果:
注:字體顏色是由先前的功能來確定。括號內的數字是對比度。
另一個稱爲YIQ
(,因爲它與RGB顏色空間轉換爲YIQ)simpliest和不太精確的方式:
public function getContrastColor($hexcolor) {
$r = hexdec(substr($hexcolor, 0, 2));
$g = hexdec(substr($hexcolor, 2, 2));
$b = hexdec(substr($hexcolor, 4, 2));
$yiq = (($r * 299) + ($g * 587) + ($b * 114))/1000;
return ($yiq >= 128) ? 'black' : 'white';
}
1計算亮度或者顏色的亮度遠遠優於平均RGB值。 #FF0000是鮮紅色的,而不是85的平均值會讓你相信的深色。在HSB系統中(B爲0-100%),對於鮮紅色,B = 100。在實驗室系統中,只有54個,可能更有用,因爲它高於50%,表明你應該使用黑色而不是白色。 – 2009-08-25 23:51:23
這是一個偉大的發現! – Wilco 2009-08-25 23:53:31