根据IP地址选择颜色

时间:2012-01-11 01:31:59

标签: php colors ip

在我的PHP(v5.2.17)脚本中,我想根据用户的IP地址为当前用户的条目选择一种唯一的颜色。我不想映射十六进制代码中的颜色值,因为我还想逐渐淡化每个条目的颜色。颜色必须始终将其中一个RGB值设置为零(它就像一组明亮的原色)。

有没有一个聪明的数学解决方案来做到这一点?

如果任何阅读本书的数学专业人士能够分享一些见解,我将不胜感激。 : - )

3 个答案:

答案 0 :(得分:2)

你真的只限于六种“基础”颜色吗?

255 255 0
255 0 255
0 255 255

0 0 255
0 255 0
255 0 0

我认为你将对这些颜色应用线性函数来尝试淡化它们。这看起来不一定像你想象的那样好 - 作为表示的RGB不是非常线性的。通过使用HSV or HSL表示,您可以便宜地逼近更好的“线性”表示。它们肯定不是完美的,但它会比RGB更自然。

至于将IP地址映射到颜色,您可以将这些颜色组合存储在一个数组中,并使用简单的hash function在六个元素中进行选择。这样的事情可能就足够了:

b1, b2, b3, b4 = <split the four bytes from an IP address>
index = (b1 * 17 + (b2 * 17 + (b3 * 17 + b4))) % 6

(我刚刚从空中挑选了乘数17 - 它的二进制表示为10001,这意味着地址中每个字节的位相互“涂抹”。一旦你选择了几种颜色和一些IP地址,你可以尝试将乘数改为例如2153,看看最有意义的是什么。)

答案 1 :(得分:1)

虽然这不会给你一个{R,G,B}中的一个始终为0的结果,但HSL表示可能看起来不错。例如,让hue成为从0到1的十进制值,由

定义
(float)(octet[0] + octet[1] << 8 + octet[2] << 16 + octet[3] << 24) / (2^32-1)

,其中每个octet[i]是无符号字节,^是取幂的)。然后根据您的喜好手动设置亮度和饱和度。只是一个想法!

作为一个额外的好处,这使得颜色容易褪色(只是从饱和度/亮度中减去“时间”的某些部分)。

答案 2 :(得分:-2)

您使用数据库存储关系吗?你总是可以获取用户的IP地址

<?php
    function userIP(){
        if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
            $userIp=$_SERVER['HTTP_X_FORWARDED_FOR'];
        } else {
            $userIp=$_SERVER['REMOTE_ADDR'];
        }
        return trim($userIp);
    }
?>

然后使用该函数设置IP的可用变量:

<?php
    $Users_IP_address = userIP();
?> 

一旦你有了这个,你可以指定一个未使用的颜色并保存该关联以供将来参考。