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
Форумы портала PHP.SU :: Версия для печати :: Как достать из картинки цвет нужного пикселя?
Форумы портала PHP.SU » » Графика в PHP » Как достать из картинки цвет нужного пикселя?

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

1. TrAxeX864 - 10 Ноября, 2011 - 12:08:03 - перейти к сообщению
Здравствуйте! Пробовал искать ответ на этот вопрос в поисковиках, но так ничего и не нашел.

Задача стоит в следующем:
Есть картинка (любая), нужно с помощью PHP скрипта выделить из нее основные цвета (по процентам). Я даже не могу найти как определить цвет отдельного пикселя в изображении.

Пожалуйста подскажите как можно реализовать такую задачу.

Вот пример реализации данной задачи:
http://wpapers[dot]ru/wallpapers/3d/Rendering/3004/
2. Мелкий - 10 Ноября, 2011 - 12:37:13 - перейти к сообщению
3. TrAxeX864 - 10 Ноября, 2011 - 12:40:57 - перейти к сообщению
Выдает 7-значную цифру? Как преобразовать в формат RGB? Кроме того, - эта функция сильно кушает память, с помощью нее не возможно определить процент пикселов определенного цвета в изображении.

Может это можно на JS сделать?
4. Самогонщик - 10 Ноября, 2011 - 12:45:18 - перейти к сообщению
imagecolorsforindex?

Справку читают только трусы.
5. TrAxeX864 - 10 Ноября, 2011 - 13:00:27 - перейти к сообщению
Самогонщик пишет:
imagecolorsforindex?

Справку читают только трусы.


А как перевести полученный в массив в строку формата #FF0000 например?
6. Самогонщик - 10 Ноября, 2011 - 13:23:52 - перейти к сообщению
http://forum[dot]codecall[dot]net/php-tu[dot][dot][dot]ors-rgb-php[dot]html

Поиском пользуются только трусы.
7. TrAxeX864 - 10 Ноября, 2011 - 16:33:41 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. class ParsingColors
  2. {
  3.         //В этой переменной храниться ссылка на изображение
  4.         var $img_obj;
  5.        
  6.         //Всего цветов в картинке
  7.         var $total_colors;
  8.        
  9.         //Массив в котором содержаться все цвета и их количество в изображении
  10.         var $arr_colors;
  11.        
  12.         function __construct($img_path)
  13.         {
  14.                 //Создаем картинку
  15.                 $this->img_obj = imagecreatefromjpeg($img_path);
  16.  
  17.                 $this->img_height = imagesy($this->img_obj);
  18.                 $this->img_width = imagesx($this->img_obj);
  19.         }
  20.        
  21.         /****
  22.         Метод с которого начинается распаршивание картинки на цвета
  23.         ****/
  24.         function process($interval_check) //Интервал проверки пикселей на цвет
  25.         {
  26.                 for($i=0;$i<$this->img_height;$i++)
  27.                 {
  28.                         for($a=0;$a<$this->img_width;$a=$a+$interval_check)
  29.                         {
  30.                                 $color = dechex(imagecolorat($this->img_obj, $i, $a));
  31.                        
  32.                                 if(empty($array[$color])) { $array[$color] = 1; $this->total_colors++; }
  33.                                 else $array[$color]++;
  34.                         }
  35.                 }
  36.                
  37.                 $this->destroy_img();
  38.                
  39.                 $this->arr_colors = $array;
  40.                
  41.                 return $array;
  42.         }
  43.        
  44.         /****
  45.         Метод отбирает цвета, которые наиболее часто используются и определяет процент использования
  46.         ДЛЯ ВЫВОЗА ТРЕБУЕТСЯ ЗНАЧЕНИЕ ВОЗВРАЩАЕМОЕ ФУНКЦИЕЙ $this->process()
  47.         ****/
  48.         function Sort($limit)
  49.         {
  50.                 $array = $this->arr_colors;
  51.                
  52.                 unset($array[0]);
  53.                 arsort($array);
  54.                
  55.                 //Счетчик
  56.                 $c = 1;
  57.                 foreach($array as $key => $var)
  58.                 {
  59.                         $result['procent'][$key] = ($var / $this->total_colors) * 100;
  60.                        
  61.                         if($c == $limit)
  62.                                 break;
  63.                                
  64.                         $c++;
  65.                 }
  66.                
  67.                 return $result;
  68.         }
  69.        
  70.         /****
  71.         Метод для уничтожения картинки
  72.         ****/
  73.         function destroy_img()
  74.         {
  75.                 if($this->img_obj)
  76.                         imagedestroy($this->img_obj);
  77.         }
  78. }
  79.  
  80. $img = new ParsingColors('1.jpg');
  81. //Интервал проверки пиксела на цвет
  82. $img->process(5);
  83.  
  84. $result = $img->Sort(20);
  85.  
  86. foreach($result['procent'] as $key => $var)
  87. {
  88.         echo "<div style='min-width:50px; min-height:50px; margin:5px; background-color:#{$key}; float:left;'>{$key} {$var}</div>";
  89. }


Написал такой класс, но он выводит 20 самых популярных цветов! А нужно чтобы выводил как здесь http://wpapers.ru/wallpapers/avto/other-cars/5647/. Тоесть чтобы не выводил чисто одинаковые цвета.
8. Самогонщик - 10 Ноября, 2011 - 16:42:42 - перейти к сообщению
Тебе нужно огрублять палитру перед поиском похожих цветов. Т.е. если у тебя палитра тру колор, то imagecolorat как я подозреваю возвращает код цвета.

Можно просто полученный код обработать битовой маской под операцией И. маска типа такой f0f0f0 уменьшит количество цветов до 16 в кубе. можно сделать маску более агрессивной.

TrAxeX864 пишет:
dechex(imagecolorat($this->img_obj, $i, $a)
Конвертировать сразу в хексы не лучшее решение, лучше хранить числа как есть, а конвертировать уже по потребности.
9. TrAxeX864 - 10 Ноября, 2011 - 17:21:23 - перейти к сообщению
Цитата:
Можно просто полученный код обработать битовой маской под операцией И. маска типа такой f0f0f0 уменьшит количество цветов до 16 в кубе. можно сделать маску более агрессивной.

А можете написать пример кода, как это можно сделать?
10. Самогонщик - 10 Ноября, 2011 - 17:37:50 - перейти к сообщению
яндекс "php битовые операции" первая же ссылка
http://www[dot]rinatous[dot]com/blog/node/1[dot]html

CODE (htmlphp):
скопировать код в буфер обмена
  1. $color = imagecolorat($this->img_obj, $i, $a)&0xf0f0f0


Надеюсь ты понимаешь, что если изображение содержит палитру, можно огребсти проблем.
11. TrAxeX864 - 10 Ноября, 2011 - 19:01:23 - перейти к сообщению
Самогонщик пишет:
яндекс "php битовые операции" первая же ссылка
http://www[dot]rinatous[dot]com/blog/node/1[dot]html

CODE (htmlphp):
скопировать код в буфер обмена
  1. $color = imagecolorat($this->img_obj, $i, $a)&0xf0f0f0


Надеюсь ты понимаешь, что если изображение содержит палитру, можно огребсти проблем.


В работе с байтами я не силен. Но сейчас постараюсь сделать как вы сказали Улыбка &0xf0f0f0 - эта операция нужна для того чтобы находить цвета похожие на #f0f0f0?
12. Самогонщик - 10 Ноября, 2011 - 19:11:02 - перейти к сообщению
на каждую компоненту цвет в труколор приходится по одному байту. Итого 3 байта, или 4 если с прозрачностью. Маска 0xf0 равна 11110000 в бинарном представлении. После операции И все биты числа с цветом там где у маски были нули перавращаются в нуль, а где были единицы остаются как были. Получается что для каждого цвета остаётся всего 16 разных значений, т.е. происходит загрубление. Если взять маску где больше нулей, можно загрубить ещё сильнее.

Упрощённое объяснение: #324523, #344d2e - два разных цвета, после такой операции превратятся в #304020 и #304020, которые уже одинаковы. т.е. похожие цвета посчитаем вместе, а не по отдельности.
13. TrAxeX864 - 10 Ноября, 2011 - 19:34:46 - перейти к сообщению
http://korzh[dot]net/2009-10-poisk-k[dot][dot][dot]ya-ix-cveta[dot]html - Нашел решение проблемы! Возможно кому-нибудь пригодится!

Самогонщик, спасибо за помощь!

 

Powered by ExBB FM 1.0 RC1