1.該当するシナリオ: 対応する写真を色別にリストします。
2. メインプログラムとAPIの説明:
[php]
クラス MajorColor
{
//基準色
保護された $_colors = null;
//許容範囲
保護された $_tolerance = 80;
//無視される色
$_ignoreColors = array();
//サポートされている画像タイプ
protected $_funcs = array('image/png' => 'imagecreatefrompng', 'image/jpeg' => 'imagecreatefromjpeg', 'image/gif' => 'imagecreatefromgif');
パブリック関数 __construct(array $colors = null) {
If(null !== $colors) {
$this->_colors = $colors;
}
}
パブリック関数 setColors(array $colors) {
$this->_colors = $colors;
}
パブリック関数 setTolerance($tolerance) {
$this->_tolerance = $tolerance;
}
パブリック関数 setIgnoreColors($colors) {
$this->_ignoreColors = $colors;
}
パブリック関数 _isValidColor($confVal, $val) {
If(is_array($confVal)) {
return $val >= $confVal[0] && $val
return $val >= $confVal - $this->_tolerance && $val _tolerance
}
}
パブリック関数 getOrderedColors($pic) {
$size = getimagesize($pic);
if(!$size) {
false を返します
}
$width = $size[0];
$height = $size[1];
$mime = $size['mime'];
$func = isset($this->_funcs[$mime]) $this->_funcs[$mime] : null;
If(!$func) {
false を返します
}
$im = $func($pic);
if(!$im) {
false を返します
}
$total = $幅 * $高さ
$nums = array();
for($i = 0; $i
for($m = 0; $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)) {
続く;
}
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);
$nums を返します。
}
パブリック関数 getMajorColor($pic) {
$nums = $this->getOrderedColors($pic);
$keys = array_keys($nums);
$keys[0] を返します;
}
}
1.void setColors(array $colors)
選択可能な色、つまり上の図の「すべての色」の下にあるすべての色 (白、灰、黑...) を設定します
2.void setTolerance(int $tolerance)
設置容量差、たとえば色の RGB 値は (0,255,0) で、設置容量差が 40 の場合、-403.void setIgnoreColors(array $colors)
4.array getOrderedColors($pic)
$pic に基づいて、さまざまな色 (setColors で設定された色) の適合数を取得し、適合数は上位から下位の順に並べられます
5.mix getMajorColor($pic)
内部ではgetOrderedColorsを使用し、適合量最高の色のキーを返します
三、$colorsの格式及び范围決定
1. $colors 内のさまざまな色の違いが明らかな場合は、単一の入力色の値のみが必要であり、内部では setTolerance 設定の許容差に基づいて各色が区別されます。
[php]
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 範囲を個別に設定する必要があります。
[php]
$colors = array(
1 => 配列('赤' => 配列(189, 230), '緑' => 配列(189, 230), '青' => 配列(189, 230)),
2 => 配列('赤' => 配列(0, 37), '緑' => 配列(0, 37), '青' => 配列(0, 37)),
3 => 配列('赤' => 配列(128, 255), '緑' => 配列(0, 76), '青' => 配列(0, 100)),
);
さまざまな色が明確に区別できるようになるまで、一連の微調整が必要です。
著者: xiaodao1986
http://www.bkjia.com/PHPjc/478033.html