2009-11-17 50 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