Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: определить цвет всех пикселей картинки

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
maxy666
Отправлено: 15 Марта, 2013 - 20:33:59
Post Id


Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Март 2013  


Помог: 0 раз(а)




Помогите пожалуйста реализовать на php следующее:
распознать цвета каждого пикселя на картинке и записать их вывести их массивом или записать в базу данных. в виде: координаты пикселя = цвет в RGB

как вариант может попробовать функцию imagecolorat и поочередно в цикле перебрать все пиксели картинки.
$color = imagecolo6rat($image, $x[i], $y[j]);
Помогите пожалуйста
 
 Top
Мелкий Супермодератор
Отправлено: 15 Марта, 2013 - 21:50:00
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




maxy666 пишет:
как вариант может попробовать функцию imagecolorat и поочередно в цикле перебрать все пиксели картинки.

Ну, в общем-то, других вариантов и не предвидится.


-----
PostgreSQL DBA
 
 Top
TroL
Отправлено: 03 Апреля, 2013 - 12:37:09
Post Id


Гость


Покинул форум
Сообщений всего: 73
Дата рег-ции: Нояб. 2012  


Помог: 0 раз(а)




Вот мой старый пример, реализует вот что...
берет картинку, проганяет по всем пикселям и считывает цвет.
сокращает количество отенков из 16 000 000 до 4 000
потом подсчитывает количество тех или иных цветов, и берет 8 самых популярных цветов, потом обеденяем в строку и записываем в бд
PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3.     $img = ПУТЬ К КАРТИНКИ;
  4.     $color = color_index($img);
  5.     $color=implode(';',$color);//Объеденим массив в строку
  6.  
  7. $query = "UPDATE `catalog_photo` SET
  8. `color` = '$color'
  9.    WHERE `id` = $row[id] LIMIT 1";
  10. mysql_query($query);
  11.  
  12. function color_index($source_src,$index_colors=8)//индексирование цветов картинки
  13. {
  14.    
  15. $size = getimagesize($source_src);//размеры картинки
  16.  
  17. $image_type=file_ext($source_src);//расширение файла изображения, ничего сложного
  18. echo $image_type;
  19. switch ($image_type)//загнали img в дескриптор, для каждого типа файла своя ф-ия
  20. {
  21. case 'gif': $source = @imagecreatefromgif($source_src); break;
  22. default:case 'jpg': $source = @imagecreatefromjpeg($source_src); break;
  23. case 'png': $source = @imagecreatefrompng($source_src); break;
  24. }
  25.  
  26.  
  27. $INDEX=array();
  28. $I=array();
  29.  
  30. $b = 1;
  31. $size1 = $size[1]*2;
  32. $size2 = $size1+50;
  33. $size0 = $size[0]*2;
  34.  
  35.  
  36. for($y=0;$y<=$size[1]-1;$y++)//перебираем точки картинки по x
  37. {
  38.  
  39.  
  40. for($x=0;$x<=$size[0]-1;$x++)//перебираем точки картинки по y
  41. {
  42.  
  43.  
  44.  
  45. $color=ImageColorAt($source, $x, $y);//берем цвет в точке n
  46. $rgb_arr_0=imagecolorsforindex($source, $color);//переводим цвет в rgb
  47. $rgb_arr[0]=$rgb_arr_0['red'];
  48. $rgb_arr[1]=$rgb_arr_0['green'];
  49. $rgb_arr[2]=$rgb_arr_0['blue'];
  50. $I[$color]++;
  51.  
  52. $INDEX[$color]=rgb2hex2rgb(implode('.',$rgb_arr));//rgb в hex, заносим все данные для последующего построения рейтинга
  53. //$rgb = "($rgb_arr[0], $rgb_arr[1], $rgb_arr[2])";
  54. //$newColor = newColorMask($INDEX[$color]);
  55. //var_dump($newColor);
  56. $b++;
  57.  
  58. }
  59. $ngb = 0;
  60.  
  61. }
  62.  
  63.  
  64.  
  65. $out_0=array();
  66. $out=array();
  67. $outer = array();
  68.  
  69. foreach($INDEX as $key=>$color_hex){//перебираем все полученые цвета, представим как номер цвета php GD в палитре изображения => цвет в hex
  70. $out_0[$I[$key]][]=$color_hex;//для каждого цвета создадим суб-массив, в него запишем инкриментом количество вхождений данного цвета sizeof($out_0[$I[$key]])= к-во н-ого цвета в массиве цветов
  71. #echo $color_hex.' => '.$I[$key].'
  72. //как бы такой массив
  73. }
  74.  
  75. foreach($out_0 as $incolor){//переберем все hex суб-массивы в обратном порядке, обеденим многомерный массив в одномерный
  76.     rsort($incolor);
  77.     $out[]=implode(',',$incolor);
  78. }
  79.  
  80. $out=implode(',',$out);//Объеденим массив в строку
  81. $out=explode(',',$out);//разобем строку в массив
  82. //две предыдущие операции - гарантия получения одномерного массива
  83. $out_0=array();
  84. //var_dump($out);
  85.  
  86. $maskcolor = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F");
  87. $maskcolor2 = array("0", "4", "8",  "C");
  88.  
  89.  
  90. foreach ($out as $key => $out_mask){
  91.     $out_mask =  substr($out_mask, 1);
  92.     $outearr = str_split($out_mask, 1);
  93.  
  94. $keyw = array_search($outearr[0], $maskcolor)+1;
  95. $outkey[0] = ceil($keyw/4)-1;
  96. $outval[0] =  $maskcolor2[$outkey[0]];
  97. $outval[1] =  $outval[0];
  98.  
  99. $keyw = array_search($outearr[2], $maskcolor)+1;
  100. $outkey[2] = ceil($keyw/4)-1;
  101. $outval[2] =  $maskcolor2[$outkey[2]];
  102. $outval[3] =  $outval[2];
  103.  
  104. $keyw = array_search($outearr[4], $maskcolor)+1;
  105. $outkey[4] = ceil($keyw/4)-1;
  106. $outval[4] =  $maskcolor2[$outkey[4]];
  107. $outval[5] =  $outval[4];
  108.  
  109. $outvalue[$key] = '#'.$outval[0].$outval[1].$outval[2].$outval[3].$outval[4].$outval[5];
  110.  
  111.    /* $outearr[1] = $outearr[0];
  112.     $outearr[3] = $outearr[2];
  113.     $outearr[5] = $outearr[4];
  114.  
  115. $new_out[$key] = "#".$outearr[0].$outearr[1].$outearr[2].$outearr[3].$outearr[4].$outearr[5];*/
  116.  
  117. }
  118.  
  119.  
  120. $out = $outvalue;
  121. $outcount = array_count_values($out);
  122. arsort($outcount);
  123. reset($outcount);
  124. while (list($key, $val) = each($outcount)) {
  125.    $outers[] = $key;
  126.    $outersval[] = $val;
  127. }
  128.  
  129.  
  130. for($i=sizeof($outers);$i>sizeof($outers)-$index_colors;$i--)//получим $out_0[0]=hex с max числом вхождений, т.е. самый частовстречающийся цвет по рейтингу
  131. {
  132.     $out_0[]=$outer[$i];
  133. }
  134. $outs = array_chunk($outers, $index_colors);
  135. $outsval = array_chunk($outersval, $index_colors);
  136. /*
  137. foreach ($outs[0] as $key=>$outer) {
  138.  
  139.     echo "<div style='float:left; width:105px; height:20px; margin:5px; background-color:".$outer."'>".$outer."-".$outersval[$key]."</div>";
  140. }*/
  141. //
  142.  
  143.  
  144. return $outs[0];//вернули массив наиболее частовстречающихся цветов по рейтингу, где $out_0[0] = наиболее частый
  145. }
  146.  
  147.  
  148.  
  149.  
  150. function newColorMask($out_mask){
  151. $maskcolor = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F");
  152. $maskcolor2 = array("0", "4", "8", "C");
  153.  
  154. $out_mask =  substr($out_mask, 1);
  155. $outearr = str_split($out_mask, 1);
  156.  
  157.  
  158. $keyw = array_search($outearr[0], $maskcolor)+1;
  159. $outkey[0] = ceil($keyw/4)-1;
  160. $outval[0] =  $maskcolor2[$outkey[0]];
  161. $outval[1] =  $outval[0];
  162.  
  163. $keyw = array_search($outearr[2], $maskcolor)+1;
  164. $outkey[2] = ceil($keyw/4)-1;
  165. $outval[2] =  $maskcolor2[$outkey[2]];
  166. $outval[3] =  $outval[2];
  167.  
  168. $keyw = array_search($outearr[4], $maskcolor)+1;
  169. $outkey[4] = ceil($keyw/4)-1;
  170. $outval[4] =  $maskcolor2[$outkey[4]];
  171. $outval[5] =  $outval[4];
  172.  
  173.  
  174. $outvalue = '#'.$outval[0].$outval[1].$outval[2].$outval[3].$outval[4].$outval[5];
  175.  
  176. //$new_out = "#".$outearr[0].$outearr[1].$outearr[2].$outearr[3].$outearr[4].$outearr[5];
  177. //$new_out1 = "#".$outearr[0].$outearr[0].$outearr[2].$outearr[2].$outearr[4].$outearr[4];
  178.  
  179. return $outvalue;
  180. }
  181.  
  182.  
  183.  
  184. function file_ext($file)//на входе - имя файла (можно с путями),возвращает расширение файла изображения
  185. {
  186.     $image_type_arr=explode("/",$file);
  187. $image_type_arr=explode(".",$image_type_arr[sizeof($image_type_arr)-1]);
  188. return strtolower((strlen($image_type_arr[1])>3)?'jpg':$image_type_arr[1]);
  189. }
  190.  
  191.  
  192. function rgb2hex2rgb($c)//конверт rgb->hex->rgb
  193. {
  194. if(!$c) return false;
  195. $c = trim($c);
  196. $out = false;
  197. if(preg_match("/^[0-9ABCDEFabcdef\#]+$/i", $c)){
  198. $c = str_replace('#','', $c);
  199. $l = strlen($c) == 3 ? 1 : (strlen($c) == 6 ? 2 : false);
  200.  
  201. if($l){
  202. unset($out);
  203. $out[0] = $out['r'] = $out['red'] = hexdec(substr($c, 0,1*$l));
  204. $out[1] = $out['g'] = $out['green'] = hexdec(substr($c, 1*$l,1*$l));
  205. $out[2] = $out['b'] = $out['blue'] = hexdec(substr($c, 2*$l,1*$l));
  206. }else $out = false;
  207.  
  208. }elseif (preg_match("/^[0-9]+(,| |.)+[0-9]+(,| |.)+[0-9]+$/i", $c)){
  209. $spr = str_replace(array(',',' ','.'), ':', $c);
  210. $e = explode(":", $spr);
  211. if(count($e) != 3) return false;
  212. $out = '#';
  213. for($i = 0; $i<3; $i++)
  214. $e[$i] = dechex(($e[$i] <= 0)?0:(($e[$i] >= 255)?255:$e[$i]));
  215.  
  216. for($i = 0; $i<3; $i++)
  217. $out .= ((strlen($e[$i]) < 2)?'0':'').$e[$i];
  218.  
  219. $out = strtoupper($out);
  220. }else $out = false;
  221.  
  222. return $out;
  223. }
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Графика в PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB