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]   

> Без описания
TrAxeX864
Отправлено: 10 Ноября, 2011 - 12:08:03
Post Id


Новичок


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


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




Здравствуйте! Пробовал искать ответ на этот вопрос в поисковиках, но так ничего и не нашел.

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

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

Вот пример реализации данной задачи:
http://wpapers[dot]ru/wallpapers/3d/Rendering/3004/
 
 Top
Мелкий Супермодератор
Отправлено: 10 Ноября, 2011 - 12:37:13
Post Id



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


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


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






-----
PostgreSQL DBA
 
 Top
TrAxeX864
Отправлено: 10 Ноября, 2011 - 12:40:57
Post Id


Новичок


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


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




Выдает 7-значную цифру? Как преобразовать в формат RGB? Кроме того, - эта функция сильно кушает память, с помощью нее не возможно определить процент пикселов определенного цвета в изображении.

Может это можно на JS сделать?

(Отредактировано автором: 10 Ноября, 2011 - 12:45:27)

 
 Top
Самогонщик
Отправлено: 10 Ноября, 2011 - 12:45:18
Post Id



Посетитель


Покинул форум
Сообщений всего: 495
Дата рег-ции: Окт. 2011  


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




imagecolorsforindex?

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

(Отредактировано автором: 10 Ноября, 2011 - 12:45:47)

 
 Top
TrAxeX864
Отправлено: 10 Ноября, 2011 - 13:00:27
Post Id


Новичок


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


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




Самогонщик пишет:
imagecolorsforindex?

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


А как перевести полученный в массив в строку формата #FF0000 например?
 
 Top
Самогонщик
Отправлено: 10 Ноября, 2011 - 13:23:52
Post Id



Посетитель


Покинул форум
Сообщений всего: 495
Дата рег-ции: Окт. 2011  


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




http://forum[dot]codecall[dot]net/php-tu[dot][dot][dot]ors-rgb-php[dot]html

Поиском пользуются только трусы.
 
 Top
TrAxeX864
Отправлено: 10 Ноября, 2011 - 16:33:41
Post Id


Новичок


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


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




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/. Тоесть чтобы не выводил чисто одинаковые цвета.

(Отредактировано автором: 10 Ноября, 2011 - 16:34:19)

 
 Top
Самогонщик
Отправлено: 10 Ноября, 2011 - 16:42:42
Post Id



Посетитель


Покинул форум
Сообщений всего: 495
Дата рег-ции: Окт. 2011  


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




Тебе нужно огрублять палитру перед поиском похожих цветов. Т.е. если у тебя палитра тру колор, то imagecolorat как я подозреваю возвращает код цвета.

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

TrAxeX864 пишет:
dechex(imagecolorat($this->img_obj, $i, $a)
Конвертировать сразу в хексы не лучшее решение, лучше хранить числа как есть, а конвертировать уже по потребности.
 
 Top
TrAxeX864
Отправлено: 10 Ноября, 2011 - 17:21:23
Post Id


Новичок


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


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




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

А можете написать пример кода, как это можно сделать?
 
 Top
Самогонщик
Отправлено: 10 Ноября, 2011 - 17:37:50
Post Id



Посетитель


Покинул форум
Сообщений всего: 495
Дата рег-ции: Окт. 2011  


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




яндекс "php битовые операции" первая же ссылка
http://www[dot]rinatous[dot]com/blog/node/1[dot]html

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


Надеюсь ты понимаешь, что если изображение содержит палитру, можно огребсти проблем.
 
 Top
TrAxeX864
Отправлено: 10 Ноября, 2011 - 19:01:23
Post Id


Новичок


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


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




Самогонщик пишет:
яндекс "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?
 
 Top
Самогонщик
Отправлено: 10 Ноября, 2011 - 19:11:02
Post Id



Посетитель


Покинул форум
Сообщений всего: 495
Дата рег-ции: Окт. 2011  


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




на каждую компоненту цвет в труколор приходится по одному байту. Итого 3 байта, или 4 если с прозрачностью. Маска 0xf0 равна 11110000 в бинарном представлении. После операции И все биты числа с цветом там где у маски были нули перавращаются в нуль, а где были единицы остаются как были. Получается что для каждого цвета остаётся всего 16 разных значений, т.е. происходит загрубление. Если взять маску где больше нулей, можно загрубить ещё сильнее.

Упрощённое объяснение: #324523, #344d2e - два разных цвета, после такой операции превратятся в #304020 и #304020, которые уже одинаковы. т.е. похожие цвета посчитаем вместе, а не по отдельности.
 
 Top
TrAxeX864
Отправлено: 10 Ноября, 2011 - 19:34:46
Post Id


Новичок


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


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




http://korzh[dot]net/2009-10-poisk-k[dot][dot][dot]ya-ix-cveta[dot]html - Нашел решение проблемы! Возможно кому-нибудь пригодится!

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

(Отредактировано автором: 10 Ноября, 2011 - 19:35:23)

 
 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