
Определение основного цвета изображения на PHP
В различных поисковых системах есть возможность поиска изображения по цвету, например, "только синие" или "только зеленые". Естественно, это не означает стопроцентную синюю или зеленую заливку, а определяет преобладающий цвет картинки. Такой цвет называется основным. Алгоритм поиска основного цвета очень простой: надо просто подсчитать суммарные значения по каждому из каналов RGB для каждого пиксела изображения, а затем разделить полученные значения на общее количество пикселов. На PHP это реализуется примерно так:Code (PHP) : Убрать нумерацию
- // Файл для определения основного цвета
- $im=ImageCreateFromJPEG('test.jpg');
- $total_R=0;
- $total_G=0;
- $total_B=0;
- // Размеры изображения
- $width=ImageSX($im);
- $height=ImageSY($im);
- // Подсчитать суммарные значения по RGB
- for ($x=0; $x<$width; $x++) {
- for ($y=0; $y<$height; $y++) {
- $rgb=ImageColorAt($im,$x,$y);
- $total_R+=($rgb>>16) & 0xFF;
- $total_G+=($rgb>>8) & 0xFF;
- $total_B+=$rgb & 0xFF;
- }
- }
- // Прибраться за собой
- ImageDestroy($im);
- // Определение значений RGB основного цвета
- $avg_R=round($total_R/$width/$height);
- $avg_G=round($total_G/$width/$height);
- $avg_B=round($total_B/$width/$height);
Основной цвет изображения определен, но использовать его для поиска изображений по критерию "цвет" пока не получится, так как слишком большой разброс значений. Надо преобразовать значение "оттенок красного" или "оттенок желтого" в абсолютно красный или абсолютно желтый, для этого удобнее всего перевести RGB в HSV и проанализировать цветовой тон (Hue), насыщенность (Saturation) и яркость (Value).
Code (PHP) : Убрать нумерацию
- // Перевести RGB в HSV
- $R=($avg_R/255);
- $G=($avg_G/255);
- $B=($avg_B/255);
- $maxRGB=max(array($R, $G, $B));
- $minRGB=min(array($R, $G, $B));
- $delta=$maxRGB-$minRGB;
- // Цветовой тон
- if ($delta!=0) {
- if ($maxRGB==$R) {
- $h=(($G-$B)/$delta);
- }
- elseif ($maxRGB==$G) {
- $h=2+($B-$R)/$delta;
- }
- elseif ($maxRGB==$B) {
- $h=4+($R-$G)/$delta;
- }
- $hue=round($h*60);
- if ($hue<0) { $hue+=360; }
- }
- else {
- $hue=0;
- }
- // Насыщенность
- if ($maxRGB!=0) {
- $saturation=round($delta/$maxRGB*100);
- }
- else {
- $saturation=0;
- }
- // Яркость
- $value=round($maxRGB*100);
Code (PHP) : Убрать нумерацию
- // Яркость меньше 30%
- if ($value<30) {
- // Черный
- $color='#000000';
- }
- // Яркость больше 85% и насыщенность меньше 15%
- elseif ($value>85 && $saturation<15) {
- // Белый
- $color='#FFFFFF';
- }
- // Насыщенность меньше 25%
- elseif ($saturation<25) {
- // Серый
- $color='#909090';
- }
- // Определить цвет по цветовому тону
- else {
- // Красный
- if ($hue>320 || $hue<=40) {
- $color='#FF0000';
- }
- // Розовый
- elseif ($hue>260 && $hue<=320) {
- $color='#FF00FF';
- }
- // Синий
- elseif ($hue>190 && $hue<=260) {
- $color='#0000FF';
- }
- // Голубой
- elseif ($hue>175 && $hue<=190) {
- $color='#00FFFF';
- }
- // Зеленый
- elseif ($hue>70 && $hue<=175) {
- $color='#00FF00';
- }
- // Желтый
- else {
- $color='#FFFF00';
- }
- }
Просмотров: 5132 | Комментариев: 4

Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье

DiPrm
(09.06.2016 в 09:14):
Ок. Действительно так быстрее, удобнее. Но картинку приходится загружать предварительно. А если зайти на страницу и запустить JS скрипт с целью получить цвет элемента контента страницы - такое вряд ли возможно?

ManHunter
(09.06.2016 в 08:49):
На JS это сделать гораздо удобнее, canvas и все такое прочее. И работать такая реализация будет быстрее. Вот, например: http://easy-code.ru/lesson/htm...color-picker

DiPrm
(09.06.2016 в 08:45):
Хороший пример, натолкнул на мысль, что можно сделать свой online colorPicker, передавая посредством AJAX на клиентской части координаты пикселя картинки, предварительно загрузив ее на страницу.

Добавить комментарий
Заполните форму для добавления комментария

Да тоже можно, если поискать :) Например, https://html2canvas.hertzen.com
Скриншотилка на чистом JS. Она же на гитхабе: https://github.com/niklasvh/html2canvas