Гость
Покинул форум
Сообщений всего: 73
Дата рег-ции: Нояб. 2012
Помог: 0 раз(а)
|
Вот мой старый пример, реализует вот что...
берет картинку, проганяет по всем пикселям и считывает цвет.
сокращает количество отенков из 16 000 000 до 4 000
потом подсчитывает количество тех или иных цветов, и берет 8 самых популярных цветов, потом обеденяем в строку и записываем в бд
PHP:
скопировать код в буфер обмена
$img = ПУТЬ К КАРТИНКИ; $color = color_index($img); $color=implode(';',$color);//Объеденим массив в строку $query = "UPDATE `catalog_photo` SET `color` = '$color' WHERE `id` = $row[id] LIMIT 1"; function color_index($source_src,$index_colors=8)//индексирование цветов картинки { $image_type=file_ext($source_src);//расширение файла изображения, ничего сложного echo $image_type; switch ($image_type)//загнали img в дескриптор, для каждого типа файла своя ф-ия { } $b = 1; $size1 = $size[1]*2; $size2 = $size1+50; $size0 = $size[0]*2; for($y=0;$y<=$size[1]-1;$y++)//перебираем точки картинки по x { for($x=0;$x<=$size[0]-1;$x++)//перебираем точки картинки по y { $rgb_arr[0]=$rgb_arr_0['red']; $rgb_arr[1]=$rgb_arr_0['green']; $rgb_arr[2]=$rgb_arr_0['blue']; $I[$color]++; $INDEX[$color]=rgb2hex2rgb (implode('.',$rgb_arr));//rgb в hex, заносим все данные для последующего построения рейтинга //$rgb = "($rgb_arr[0], $rgb_arr[1], $rgb_arr[2])"; //$newColor = newColorMask($INDEX[$color]); //var_dump($newColor); $b++; } $ngb = 0; } foreach($INDEX as $key=>$color_hex){//перебираем все полученые цвета, представим как номер цвета php GD в палитре изображения => цвет в hex $out_0[$I[$key]][]=$color_hex;//для каждого цвета создадим суб-массив, в него запишем инкриментом количество вхождений данного цвета sizeof($out_0[$I[$key]])= к-во н-ого цвета в массиве цветов #echo $color_hex.' => '.$I[$key].' //как бы такой массив } foreach($out_0 as $incolor){//переберем все hex суб-массивы в обратном порядке, обеденим многомерный массив в одномерный } $out=implode(',',$out);//Объеденим массив в строку $out=explode(',',$out);//разобем строку в массив //две предыдущие операции - гарантия получения одномерного массива //var_dump($out); $maskcolor = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"); $maskcolor2 = array("0", "4", "8", "C"); foreach ($out as $key => $out_mask){ $out_mask = substr($out_mask, 1 ); $outkey[0 ] = ceil($keyw/4 )-1; $outval[0] = $maskcolor2[$outkey[0]]; $outval[1] = $outval[0]; $outkey[2 ] = ceil($keyw/4 )-1; $outval[2] = $maskcolor2[$outkey[2]]; $outval[3] = $outval[2]; $outkey[4 ] = ceil($keyw/4 )-1; $outval[4] = $maskcolor2[$outkey[4]]; $outval[5] = $outval[4]; $outvalue[$key] = '#'.$outval[0].$outval[1].$outval[2].$outval[3].$outval[4].$outval[5]; /* $outearr[1] = $outearr[0]; $outearr[3] = $outearr[2]; $outearr[5] = $outearr[4]; $new_out[$key] = "#".$outearr[0].$outearr[1].$outearr[2].$outearr[3].$outearr[4].$outearr[5];*/ } $out = $outvalue; while (list($key, $val) = each($outcount)) { $outers[] = $key; $outersval[] = $val; } for($i=sizeof($outers);$i>sizeof ($outers)-$index_colors;$i--)//получим $out_0[0]=hex с max числом вхождений, т.е. самый частовстречающийся цвет по рейтингу { $out_0[]=$outer[$i]; } /* foreach ($outs[0] as $key=>$outer) { echo "<div style='float:left; width:105px; height:20px; margin:5px; background-color:".$outer."'>".$outer."-".$outersval[$key]."</div>"; }*/ // return $outs[0];//вернули массив наиболее частовстречающихся цветов по рейтингу, где $out_0[0] = наиболее частый } function newColorMask($out_mask){ $maskcolor = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"); $maskcolor2 = array("0", "4", "8", "C"); $out_mask = substr($out_mask, 1 ); $outkey[0 ] = ceil($keyw/4 )-1; $outval[0] = $maskcolor2[$outkey[0]]; $outval[1] = $outval[0]; $outkey[2 ] = ceil($keyw/4 )-1; $outval[2] = $maskcolor2[$outkey[2]]; $outval[3] = $outval[2]; $outkey[4 ] = ceil($keyw/4 )-1; $outval[4] = $maskcolor2[$outkey[4]]; $outval[5] = $outval[4]; $outvalue = '#'.$outval[0].$outval[1].$outval[2].$outval[3].$outval[4].$outval[5]; //$new_out = "#".$outearr[0].$outearr[1].$outearr[2].$outearr[3].$outearr[4].$outearr[5]; //$new_out1 = "#".$outearr[0].$outearr[0].$outearr[2].$outearr[2].$outearr[4].$outearr[4]; return $outvalue; } function file_ext($file)//на входе - имя файла (можно с путями),возвращает расширение файла изображения { $image_type_arr=explode("/",$file); $image_type_arr=explode(".",$image_type_arr[sizeof($image_type_arr)-1 ]); } function rgb2hex2rgb($c)//конверт rgb->hex->rgb { if(!$c) return false; $out = false; if($l){ $out[0 ] = $out['r'] = $out['red'] = hexdec(substr($c, 0 ,1 *$l)); $out[1 ] = $out['g'] = $out['green'] = hexdec(substr($c, 1 *$l,1 *$l)); $out[2 ] = $out['b'] = $out['blue'] = hexdec(substr($c, 2 *$l,1 *$l)); }else $out = false; }elseif (preg_match("/^[0-9]+(,| |.)+[0-9]+(,| |.)+[0-9]+$/i", $c)){ if(count($e) != 3 ) return false; $out = '#'; for($i = 0; $i<3; $i++) $e[$i] = dechex(($e[$i] <= 0 )?0 :(($e[$i] >= 255 )?255 :$e[$i])); for($i = 0; $i<3; $i++) $out .= ((strlen($e[$i]) < 2)? '0':'').$e[$i]; }else $out = false; return $out; }
|