Самые популярные цвета в изображении (php класс)

      PHP

Здравствуйте уважаемые читатели XoZblogа! В продолжение темы статей на PHP, рассмотрим сегодня один замечательный php класс, который определяет наиболее популярные цвета в изображении и выводит данные в табличку с указанием кода цвета и количеством пикселей, занятых этим цветом.

Данный класс будет весьма полезным для сайтов фотографов, как один из элементов навигации по сайту! С помощью этого класса можно открыть  графический файл в формате GIF, JPEG или PNG. Чтобы наглядно посмотреть php класс в работе нажмите на кнопку ДЕМО, или скачайте архив с файлом класса и тестовой страницей кнопка ИСХОДНИКИ.

Этот класс представляет собой решение для поиска наиболее доминирующих цветов, используемых в изображении, используется только PHP код без каких-либо специальных расширений PHP, за исключением функций GD библиотеки. Вот непосредственно сам класс:

class GetMostCommonColors
{
 /* Имя файла изображения (это может быть JPG, GIF или PNG изображения)
 @var string */

    var $image;

    /* Возвращает цвет изображения в массив, упорядоченный в порядке убывания, где коды цвета и количество пикселей занятых цветом.
    @return array */

    function Get_Color()
    {
        if (isset($this->image))
        {
            $PREVIEW_WIDTH    = 150;  // Изменияем размер изображения.
            $PREVIEW_HEIGHT   = 150;
            $size = GetImageSize($this->image);
            $scale=1;
            if ($size[0]>0)
            $scale = min($PREVIEW_WIDTH/$size[0], $PREVIEW_HEIGHT/$size[1]);
            if ($scale < 1)
            {
                $width = floor($scale*$size[0]);
                $height = floor($scale*$size[1]);
            }
            else
            {
                $width = $size[0];
                $height = $size[1];
            }
            $image_resized = imagecreatetruecolor($width, $height);
            if ($size[2]==1)
            $image_orig=imagecreatefromgif($this->image);
            if ($size[2]==2)
            $image_orig=imagecreatefromjpeg($this->image);
            if ($size[2]==3)
            $image_orig=imagecreatefrompng($this->image);
            imagecopyresampled($image_resized, $image_orig, 0, 0, 0, 0, $width, $height, $size[0], $size[1]); // Копируем и изменяем размеры части изображения с пересэмплированием!
            $im = $image_resized;
            $imgWidth = imagesx($im);
            $imgHeight = imagesy($im);
            for ($y=0; $y < $imgHeight; $y++)
            {
                for ($x=0; $x < $imgWidth; $x++)
                {
                    $index = imagecolorat($im,$x,$y);
                    $Colors = imagecolorsforindex($im,$index);
                    $Colors['red']=intval((($Colors['red'])+15)/32)*32; // Сокращаем количество цветов, чтобы не было повторений.
                    $Colors['green']=intval((($Colors['green'])+15)/32)*32;
                    $Colors['blue']=intval((($Colors['blue'])+15)/32)*32;
                    if ($Colors['red']>=256)
                    $Colors['red']=240;
                    if ($Colors['green']>=256)
                    $Colors['green']=240;
                    if ($Colors['blue']>=256)
                    $Colors['blue']=240;
                    $hexarray[]=substr("0".dechex($Colors['red']),-2).substr("0".dechex($Colors['green']),-2).substr("0".dechex($Colors['blue']),-2);
                }
            }
            $hexarray=array_count_values($hexarray);
            natsort($hexarray);
            $hexarray=array_reverse($hexarray,true);
            return $hexarray;

        }
        else die("Вы должны указать имя файла! (\$image параметр)");
    }
}

Остается только подключить класс к php страничке и вызвать его с параметром. Параметром является путь до файла и его имя. Также можно указать количество показываемых цветов, переменная $how_many. После в цикле выводим табличку с указанием кода цвета и количеством пикселей, занятых этим цветом.

<?php
   include_once("colors.inc.php");
   $ex=new GetMostCommonColors();
   $ex->image="test.jpg";
   $colors=$ex->Get_Color();
   $how_many=15;
   $colors_key=array_keys($colors);
?>
<table border="1">
   <tr><th colspan="3">test.jpg</th></tr>
   <tr><td>Цвет</td><td>Количество</td><td>Код цвета</td></tr>
     <?php
        for ($i = 0; $i <= $how_many; $i++)
        {
        echo "<tr><td bgcolor=".$colors_key[$i]." width=16 height=16></td>&nbsp; <td>".$colors[$colors_key[$i]]."</td><td>$colors_key[$i]</td></tr>";
        }
     ?>
</table>

Статью завершаю. Надеюсь Вы найдете применении этому PHP классу. Не забывайте оставлять комментарии! Спасибо)

бумажные обои для стен

Чтобы оставаться в курсе свежих статей и уроков подписывайтесь на еженедельную почтовую рассылку или на новостную ленту RSS. Спасибо!

  • Чувак, прикольно =) но код слегка говняный =)