ホームページ >バックエンド開発 >PHPチュートリアル >[PHP] 画像のメインカラーを決定する
[PHP] 画像の主な色を識別します
1. 該当するシナリオ: http://www.teapic.com/list.htm など、色に従って対応する画像をリストします。
2. メインプログラムと 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 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)),
);