程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> [PHP]識別圖片主色調

[PHP]識別圖片主色調

編輯:關於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)), 
); 
需要進行一系列的微調,直至能明顯區分各種顏色。
作者:xiaodao1986

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved