首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在PHP中通过对比反演RGB十六进制值

如何在PHP中通过对比反演RGB十六进制值
EN

Stack Overflow用户
提问于 2016-06-27 21:25:28
回答 2查看 4K关注 0票数 8

到目前为止,我有以下代码:

代码语言:javascript
复制
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的比赛中

解决方案:

代码语言:javascript
复制
function rgb_best_contrast($r, $g, $b) {
    return array(
        'r' => ($r < 128) ? 255 : 0,
        'g' => ($g < 128) ? 255 : 0,
        'b' => ($b < 128) ? 255 : 0
    );
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-29 20:04:27

在尝试了几十种不同的方法,试图计算出与任何给定颜色相反的颜色的最佳对比后,我终于分解并开始手工测试单个颜色的对比。

我使用这个脚本在整个RGB颜色空间中搜索任意给定颜色的最佳匹配:

代码语言:javascript
复制
$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);

总之,在我所有的结果中,出现了一个非常明显的模式。

代码语言:javascript
复制
function rgb_best_contrast($r, $g, $b) {
    return array(
        'r' => ($r < 128) ? 255 : 0,
        'g' => ($g < 128) ? 255 : 0,
        'b' => ($b < 128) ? 255 : 0
    );
}

就像预期的那样。总是给出最好的对比颜色。

票数 2
EN

Stack Overflow用户

发布于 2016-06-27 21:41:51

默认情况下,str_pad在右边添加字符--它的可选$pad_type参数默认为STR_PAD_RIGHT

您需要强制它在左边的中添加零:

代码语言:javascript
复制
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可以解决这个问题。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38063499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档