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

Тема в разделе "Веб-дизайн", создана пользователем OliverGreen, 28 июл 2016.

Метки:
Модераторы: zek24
  1. n0ll

    n0ll Создатель

    Регистр.:
    26 май 2014
    Сообщения:
    21
    Симпатии:
    1
    Недавно накидал скрипт на 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$bitmap0000$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;
    }
     
  2. monoton88

    monoton88 Создатель

    Регистр.:
    24 фев 2018
    Сообщения:
    30
    Симпатии:
    3
  3. johnnyacid123

    johnnyacid123 Писатель

    Регистр.:
    18 авг 2018
    Сообщения:
    4
    Симпатии:
    1
  4. hybrid666

    hybrid666 Писатель

    Регистр.:
    10 ноя 2014
    Сообщения:
    4
    Симпатии:
    0