@samarkand1

Как ускорить работу сайта (алгоритм расчета ближайшего цвета по известной палитре цветов)?

Приветствую,

Есть скрипт php. Основные задачи :
1. Анализ доминантных цветов изображения
2. Подбор соответствия доминантного цвета одному из цветов в заведомо известной палитре

Все это дело работает на php gd.
А именно:
1. Подбор цвета по палитре - imagecolorclosest
2. Формула - ближайшего цвета -
$diff = ( sqrt(pow($r1,2) + pow($g1,2)) + sqrt(pow($g1,2) + pow($b1,2)) + sqrt(pow($b1,2) + pow($r1,2))) / 3;


Применение дополнительной формулы расчета обусловлено тем что в палитре цветов для сравнения более 255 цветов. На практике сравнение происходит среди трех или четырех значений ( палитра до 1000 цветов)

С увеличением исходного размера изображения возрастает и время выполнения скрипта в основном за счет расчета формулы ближайшего цвета.

Замена формулы на самый упрощенный вариант
$diff = $r1 + $g1 + $b1;
дает слишком большую погрешность.

Так как время выполнения скрипта на прямую зависит от размеров исходного изображения то одним из вариантов решения задачи (помимо перехода на свой сервер) является искусственное ограничение размеров итогового изображения. Данный вариант работает но, как и следовало ожидать, на большом разрешении наблюдается потеря качества картинки.

Вопрос : как ускорить работу скрипта в рамках текущих технических ограничений ?

Ограничения:
1. Обычный shared hosting за 10$ в месяц
2. php gd

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

Демо тут goo.gl/9gQbQC
  • Вопрос задан
  • 115 просмотров
Пригласить эксперта
Ответы на вопрос 1
Adamos
@Adamos
В приведенной вами в комментариях функции явно не хватает двух вещей:
1. Кэширования, чтобы не повторять расчет для того цвета, который уже был обсчитан. Предвижу рост скорости на пару порядков.
2. Понимания того, что для нахождения ОДНОГО оптимального значения на хрен не нужно собирать целый массив и сортировать его. Вы никогда не видели алгоритм поиска наименьшего значения в массиве?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы