Определение основного цвета изображения

Недавно накидал скрипт на PHP, который определяет базовый цвет.

PHP:
/*
Опредедление базового цвета изображения.
$url - путь к файлу изображения.
$maxPreSize - размеры сжатого изображения по большей стороне.
Возвращает массив c 4 элементами описывающий цвет: Красный, Зеленый, Синий, Яркость.
Параметр Яркость может использоваться для определения яркости текста относительно базового цвета.
*/
function getDominantColors($url, $maxPreSize = 5) {
    // Определяем, существует ли указанный файл. Если нет, то выдаём ошибку.

    $url=str_replace(get_site_url()."/", "", $url);

    if(!file_exists($url))
        return false;
   
    // Определяем размер картинки, если это картинка.
    $size = getimagesize($url);
    if($size === false)
        return false;
    $width = $size[0];
    $height = $size[1];


    // Определяем формат изображения из заголовка файла и проверяем, есть ли функция, которая может это изображение открыть. Если нет, значит файл — не картинка, и выдаём ошибку.
    $format = strtolower(substr($size['mime'], strpos($size['mime'], '/') + 1));
    if($format == 'x-ms-bmp')
        $format = 'wbmp';
    $func = 'imagecreatefrom'.$format;
    if(!function_exists($func))
        return false;
    $bitmap = @$func($url);
    if(!$bitmap)
        return false;

    // Здесь мы уменьшаем исходную картинку, чтобы иметь дело не со всеми пикселями, а только с некоторыми. Это значительно увеличивает скорость алгоритма. Чем меньше размер — тем меньше точность.
    $newW = $width > $maxPreSize ? $maxPreSize : $width;
    $newH = $height > $maxPreSize ? $maxPreSize : $height;
    $bitmapNew = imagecreatetruecolor($newW, $newH);
    // Для большей точности надо использовать функцию imageCopyResambled, но она тратит очень много времени, поэтому используется быстрая и грубая функция imageCopyResized.
    imageCopyResized($bitmapNew, $bitmap, 0, 0, 0, 0, $newW, $newH, $width, $height);
    // Заносим цвета  всех пикселей в один массив
    $pixelsAmount = $newW * $newH;
    $pixels = Array();
    for($i = 0; $i < $newW; ++$i)
        for($j = 0; $j < $newH; ++$j) {
            $rgb = imagecolorat($bitmapNew, $i, $j);
            $pixels[] = Array(
                ($rgb >> 16) & 0xFF,
                ($rgb >> 8) & 0xFF,
                $rgb & 0xFF
            );
        }

    imagedestroy($bitmapNew);
    $color = Array(0,0,0,0);
    for ($i=0; $i < $pixelsAmount; $i++ ){
      $color[0]  +=  $pixels[$i][0];
      $color[1]  +=  $pixels[$i][1];
      $color[2]  +=  $pixels[$i][2];
    }

    $color[0] = floor($color[0]/$pixelsAmount);
    $color[1] = floor($color[1]/$pixelsAmount);
    $color[2] = floor($color[2]/$pixelsAmount);
    $color[3] = 0.299 * $color[0] + 0.587 * $color[1] + 0.114 * $color[2];

    return $color;
}
 
Если хотите сделать это на PHP то вам сюда
Для просмотра ссылки Войди или Зарегистрируйся

или тут

Для просмотра ссылки Войди или Зарегистрируйся


Еще можно воспользоваться сервисом, если хотите просто узнать основной цвет картинки
Для просмотра ссылки Войди или Зарегистрируйся
 
Назад
Сверху