Определение основного цвета изображения на 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);
Для очень больших изображений можно применить следующий алгоритм определения основного цвета. Изображение сжимается штатными средствами PHP до размера 1х1 пиксель, основным цветом будет являться цвет этого пиксела.
Code (PHP) : Убрать нумерацию
- // Файл для определения основного цвета
- $im=ImageCreateFromJPEG('test.jpg');
- // Размеры изображения
- $width=ImageSX($im);
- $height=ImageSY($im);
- // Сжать изображение до 1x1
- $dst=ImageCreateTrueColor(1,1);
- ImageCopyResampled($dst,$im,0,0,0,0,1,1,$width,$height);
- // Получить основной цвет
- $rgb=ImageColorAt($dst,0,0);
- $avg_R=($rgb >> 16) & 0xFF;
- $avg_G=($rgb >> 8) & 0xFF;
- $avg_B=$rgb & 0xFF;
- imageDestroy($im);
- imageDestroy($dst);
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';
- }
- }
Просмотров: 8993 | Комментариев: 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