【PHP】識別圖片主色調
一、適用情景:如http://www.teapic.com/list.htm,根據顏色列出相應圖片。
二、主程式及API解釋:
'imagecreatefrompng', 'image/jpeg' => 'imagecreatefromjpeg', 'image/gif' => 'imagecreatefromgif');public function __construct(array $colors = null) {if(null !== $colors) {$this->_colors = $colors;}}public function setColors(array $colors) {$this->_colors = $colors;}public function setTolerance($tolerance) {$this->_tolerance = $tolerance;}public function setIgnoreColors($colors) {$this->_ignoreColors = $colors;}public function _isValidColor($confVal, $val) {if(is_array($confVal)) {return $val >= $confVal[0] && $val <= $confVal[1];} else {return $val >= $confVal - $this->_tolerance && $val <= $confVal + $this->_tolerance;}}public function getOrderedColors($pic) {$size = getimagesize($pic);if(!$size) {return false;}$width = $size[0];$height = $size[1];$mime = $size['mime'];$func = isset($this->_funcs[$mime]) ? $this->_funcs[$mime] : null;if(!$func) {return false;}$im = $func($pic);if(!$im) {return false;}$total = $width * $height;$nums = array();for($i = 0; $i < $width; $i++) {for($m = 0; $m < $height; $m++) {$color_index = imagecolorat($im, $i, $m);$color_tran = imagecolorsforindex($im, $color_index);$alpha = $color_tran['alpha'];unset($color_tran['alpha']);if(100 < $alpha || in_array($color_tran, $this->_ignoreColors)) {continue;}foreach ($this->_colors as $colorid => $color) {if($this->_isValidColor($color['red'], $color_tran['red'])&& $this->_isValidColor($color['green'], $color_tran['green'])&& $this->_isValidColor($color['blue'], $color_tran['blue'])) {$nums[$colorid] = isset($nums[$colorid]) ? $nums[$colorid] + 1 : 1;}}}}imagedestroy($im);arsort($nums);return $nums;}public function getMajorColor($pic) {$nums = $this->getOrderedColors($pic);$keys = array_keys($nums);return $keys[0];}}
1.void setColors(array $colors)
設定可選顏色,即中“全部顏色”下的所有顏色(白、灰、黑...)
2.void setTolerance(int $tolerance)
設定容差,比如綠色的RGB值為(0,255,0),如果設定容差為40,那麼-40<=R<<40 && 215<=G<=295 && -40<=B<=40範圍內的所有顏色將被視為綠色。
此方法用於大致區別各顏色。
3.void setIgnoreColors(array $colors)
設定不需考慮的顏色。如大多圖片的背景是白色,而我們顯然不希望結果是白色,此時可調用此方法簡略白色。
4.array getOrderedColors($pic)
根據$pic擷取各種顏色(用setColors設定的顏色)的匹配數量,按匹配量由高到低排列
參數$pic是待檢測圖片的路徑
5.mix getMajorColor($pic)
內部調用getOrderedColors,返回匹配量最高的顏色的key
三、$colors的格式及範圍確定
1.如果$colors中的各種顏色差別很明顯,我們只需簡單的傳入顏色值,內部會根據setTolerance設定的容差來區別各顏色。
$colors = array(1 => array('red' => 0xff, 'green' => 0xff, 'blue' => 0xff),2 => array('red' => 0xc0, 'green' => 0xc0, 'blue' => 0xc0),2 => array('red' => 0x00, 'green' => 0x00, 'blue' => 0x00),);
2.setTolerance設定容差的方法只能大致區分各種顏色,如果需要更精確的控制,則需要分別設定某一顏色的R、G、B範圍
$colors = array(1 => array('red' => array(189, 230), 'green' => array(189, 230), 'blue' => array(189, 230)),2 => array('red' => array(0, 37), 'green' => array(0, 37), 'blue' => array(0, 37)),3 => array('red' => array(128, 255), 'green' => array(0, 76), 'blue' => array(0, 100)),);需要進行一系列的微調,直至能明顯區分各種顏色。
四、demo下載
http://download.csdn.net/detail/xiaodao1986/4479821
積分不夠了,賺點積分。真沒積分的朋友可以聯絡我QQ:88433062