[PHP]識別圖片主色調_PHP教程

來源:互聯網
上載者:User
一、適用情景:,根據顏色列出相應圖片。


二、主程式及API解釋:
[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)),
);
需要進行一系列的微調,直至能明顯區分各種顏色。
作者:xiaodao1986

http://www.bkjia.com/PHPjc/478033.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/478033.htmlTechArticle一、適用情景:,根據顏色列出相應圖片。 二、主程式及API解釋: [php] ?php class MajorColor { //參考顏色 protected $_colors = null; //容差 protected...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.