2009-11-17 57 views

回答

2

刚回答了一个kinda related SO question yesterday。那里的一些概念,以及由此产生的test code (on git hub)可能是一个好的开始。

由于evolve提到,扫描图像中的每个像素(甚至只是边界)可能是资源密集型的。然而,在这种情况下(因为你想识别的不仅仅是平均颜色),它可能是一条路。将徽标尺寸调整为合理的尺寸将有助于减少服务器负载,并且不应该影响输出。

更新对于这些示例假设的图像对象已经创建并$width$height已经使用imagesx()getimagesize()

背景颜色

第一确定我们需要做的是找出标志的背景颜色。这就是所有的第一个版本,通过使用角落像素。

这里使用imagecolorat()找到角落的颜色。或者,使用顶部参考答案中的平均边框颜色方法。

$color = imagecolorat($image, 0, 0); //do this for each corner 
$rgb = imagecolorsforindex($image, $color); //convert each color to a RGB array 
//average colors 

饱和

原来色彩理论具有测量兴趣的一种方式:饱和度。所以我们从标志中剔除了一个有趣的颜色。使用相同颜色的边框和文字使事情比我们想要的更单调一些,所以最后我们决定试着抓住两个有趣的颜色,如果它们存在。

您可以在上面提到的发现颜色值具有高饱和度的pixel scanning code一起在imagecolorsforindex() manual page使用RGB到HSL的功能。

亮度

我们再次转向色彩理论和意识到,我们可以使用边框颜色的亮度来决定的黑色或白色文本是否更适合。

这个SO thread列出了不同的RGB到亮度计算。我不确定哪种方法最好(或技术上正确)转换0-255 RGB图像。但是,为了完成这个任务(文本应该是黑暗的还是光明的),我不认为很重要。

+0

即将作出回应,应该指出的是,根据图像的大小,第二种方法将非常强大的服务器。 – tplaner 2009-11-17 21:50:31

+0

@evolve扫描每个像素?强化?是啊,你说得对。我更新了答案以反映这一点。对于“平均”颜色问题,最好减少到1px。 – 2009-11-17 22:00:26

+0

@Tim:伟大的回答人,谢谢。=) – 2009-11-23 13:20:58