ホームページ >バックエンド開発 >PHPチュートリアル >[PHP] 画像のメインカラーを決定する

[PHP] 画像のメインカラーを決定する

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBオリジナル
2016-06-13 13:12:441068ブラウズ

[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)),
);


4. デモをダウンロードします

http://download.csdn.net/detail/xiaodao1986/4479821

ポイントが足りない場合は、ポイントを獲得してください。本当にポイントを持っていない友人は、QQ:88433062

までご連絡ください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。