到目前为止,我有以下代码:
function hexrgb_invert($hex) {
$arr = str_split($hex, 2);
foreach ($arr as &$value) {
$c = base_convert($value, 16, 10);
$value = str_pad(base_convert(255 - $c, 10, 16), 2, '0', STR_PAD_LEFT);
}
return implode('', $arr);
}
Run Code Online (Sandbox Code Playgroud)
问题:我需要根据对比度反转颜色.上述功能适用于某些功能,但不适用于其他功能.
示例:如果输入是9d702f输出9d702f.(2种对比度低的颜色)
我没有找到任何运气在StackOverflow上寻找其他地方,因为大多数答案似乎使用我已经使用的相同算法.
更多例子:
让我们说我试图找到#FFFFFF(白色)对比的对立面.这是非常直接的,因为白色是原色,因此可以很容易地计算出相反的颜色.(上述功能将完美适用.)#FFFFFF当然#000000(黑色)相反,当你比较2种颜色时,你会得到21:1的对比度.
但是,如果我们尝试在颜色上使用上面相同的功能,#808080它将为我们提供颜色#7F7F7F.这两种颜色几乎相同,对比度仅为1.01:1.这是因为越接近十六进制80(十进制128),函数可以提供的对比度越小.
在特定情况下,#808080颜色#000000将提供最大的对比度为5.32:1.
function rgb_best_contrast($r, $g, $b) {
return array(
'r' => ($r < 128) ? 255 : 0,
'g' => ($g < 128) ? 255 : 0,
'b' => ($b < 128) ? 255 : 0
);
}
Run Code Online (Sandbox Code Playgroud)
在尝试了几十种不同的方法来尝试计算与任何给定颜色的最佳对比相反颜色之后,我终于崩溃并开始手动测试各个颜色对比度。
我使用此脚本搜索整个 RGB 颜色空间,寻找任何给定颜色的最佳匹配:
$test_a = ['r' => 128, 'g' => 128, 'b' => 128];
$best = [
'color' => ['r' => 128, 'g' => 128, 'b' => 128],
'diff' => 0.0
];
foreach (range(0, 255) as $r) {
foreach (range(0, 255) as $g) {
foreach (range(0, 255) as $b) {
$test_b = ['r' => $r, 'g' => $g, 'b' => $b];
// YQI sensitive contrast check
$diff = check::rgb_contrast($test_a, $test_b);
if ($diff > $best['diff']) {
$best = [
'color' => $test_b,
'diff' => $diff
];
}
}
}
}
var_dump($best);
Run Code Online (Sandbox Code Playgroud)
简而言之,我的所有结果都出现了一个非常明显的模式。该函数遵循该模式:
function rgb_best_contrast($r, $g, $b) {
return array(
'r' => ($r < 128) ? 255 : 0,
'g' => ($g < 128) ? 255 : 0,
'b' => ($b < 128) ? 255 : 0
);
}
Run Code Online (Sandbox Code Playgroud)
完全按照预期工作。始终提供最佳的对比色。