主页
软件技术
返回
PHP识别图片主色调

一、适用情景:,根据颜色列出相应图片。


二、主程序及API解释:
[php] 
<?php  
class MajorColor 

//参考颜色 
protected $_colors = null;  
//容差 
protected $_tolerance = 80;  
//忽略的颜色 
protected $_ignoreColors = array();  
//支持的图片类型 
protected $_funcs = array('image/png' => '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设置的容差来区别各颜色。
[php] 
$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范围www.2cto.com
[php] 
$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)), 
); 
需要进行一系列的微调,直至能明显区分各种颜色。


重庆交大破解桥梁防撞难题 为桥穿上"彩虹衣"
电气配电施工组织设计方案
建筑电气设计施工中就注意的若干问题
[上海]某大厦装饰工程施工组织设计
[福建]高层住宅人工挖孔桩安全专项方案
南京青奥模式:树立可持续赛事组织典范
户式中央空调方案推荐及分析
2009年1-4月中国水泥制品进口情况
信息发布:名易软件http://www.myidp.net