到目前为止,我有以下代码:
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);
}问题:,我需要根据对比倒置颜色。上述功能适用于某些事物,但不适用于其他事物。
示例:,如果输入是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
);
}发布于 2016-06-29 20:04:27
在尝试了几十种不同的方法,试图计算出与任何给定颜色相反的颜色的最佳对比后,我终于分解并开始手工测试单个颜色的对比。
我使用这个脚本在整个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);总之,在我所有的结果中,出现了一个非常明显的模式。
function rgb_best_contrast($r, $g, $b) {
return array(
'r' => ($r < 128) ? 255 : 0,
'g' => ($g < 128) ? 255 : 0,
'b' => ($b < 128) ? 255 : 0
);
}就像预期的那样。总是给出最好的对比颜色。
发布于 2016-06-27 21:41:51
默认情况下,str_pad在右边添加字符--它的可选$pad_type参数默认为STR_PAD_RIGHT。
您需要强制它在左边的中添加零:
str_pad(base_convert(255 - $c, 10, 16), 2, '0', STR_PAD_LEFT)详细说明您的示例:
6ff060,只考虑G值:$c = 0xf0 (小数: 240)。255 - 240 = 15 (十六进制: f)base_convert(255 - $c, 10, 16)生成:'f' (作为字符串!)str_pad(base_convert(255 - $c, 10, 16), 2, '0')在右上添加一个零,从而生成'f0'。$pad_type = STR_PAD_LEFT可以解决这个问题。https://stackoverflow.com/questions/38063499
复制相似问题