Определение доминирующего цвета фотографии дает возможность реализовать поиск изображений по цвету или сделать цветные подложки под изображения, пока они загружаются в браузере. Ниже представлены несколько методов определения цвета, который наиболее часто встречается на картинке.
Самый простой способ получить основной цвет – сжать изображение до размера 1x1px с помощью функции imagecopyresampled()
и получить цвет пикселя через imagecolorat()
.
$filename = __DIR__ . '/image.jpg';
$info = getimagesize($filename);
switch ($info[2]) {
case 1:
$img = imageCreateFromGif($filename);
break;
case 2:
$img = imageCreateFromJpeg($filename);
break;
case 3:
$img = imageCreateFromPng($filename);
break;
}
$width = ImageSX($img);
$height = ImageSY($img);
$thumb = imagecreatetruecolor(1, 1);
imagecopyresampled($thumb, $img, 0, 0, 0, 0, 1, 1, $width, $height);
$color = '#' . dechex(imagecolorat($thumb, 0, 0));
imageDestroy($img);
imageDestroy($thumb);
echo $color;
Если нужно несколько цветов, то можно ресайзить изображение до размеров 4x4, 8x8 и т.д.
Результат роботы скрипта:
Загрузите свои фото:
Перебор пикселей и вычисление среднего цвета, данный метод даёт более светлые тона.
$filename = __DIR__ . '/image.jpg';
$info = getimagesize($filename);
switch ($info[2]) {
case 1:
$img = imageCreateFromGif($filename);
break;
case 2:
$img = imageCreateFromJpeg($filename);
break;
case 3:
$img = imageCreateFromPng($filename);
break;
}
$width = ImageSX($img);
$height = ImageSY($img);
$total_r = $total_g = $total_b = 0;
for ($x = 0; $x < $width; $x++) {
for ($y=0; $y<$height; $y++) {
$c = ImageColorAt($img, $x, $y);
$total_r += ($c>>16) & 0xFF;
$total_g += ($c>>8) & 0xFF;
$total_b += $c & 0xFF;
}
}
$rgb = array(
round($total_r / $width / $height),
round($total_g / $width / $height),
round($total_b / $width / $height)
);
$color = '#';
foreach ($rgb as $row) {
$color .= str_pad(dechex($row), 2, '0', STR_PAD_LEFT);
}
imageDestroy($img);
echo $color;
Результат роботы скрипта:
Загрузите свои фото:
ColorExtractor – «извлекает цвета из изображения, как это сделал бы человек». Имеет возможность получить несколько основных цветов.
https://github.com/thephpleague/color-extractor
Установка и использование через Composer:
$ composer require league/color-extractor:0.3.*
require 'vendor/autoload.php';
use League\ColorExtractor\Color;
use League\ColorExtractor\ColorExtractor;
use League\ColorExtractor\Palette;
$palette = Palette::fromFilename(__DIR__ . '/image.jpg');
$extractor = new ColorExtractor($palette);
$colors = $extractor->extract(2);
$color_1 = Color::fromIntToHex($colors[0]);
$color_2 = Color::fromIntToHex($colors[1]);
var_dump($color_1, $color_2);
Без composer:
require __DIR__ . '/color-extractor/src/League/ColorExtractor/Color.php';
require __DIR__ . '/color-extractor/src/League/ColorExtractor/ColorExtractor.php';
require __DIR__ . '/color-extractor/src/League/ColorExtractor/Palette.php';
use League\ColorExtractor\Color;
use League\ColorExtractor\ColorExtractor;
use League\ColorExtractor\Palette;
$palette = Palette::fromFilename(__DIR__ . '/image.jpg');
$extractor = new ColorExtractor($palette);
$colors = $extractor->extract(2);
$color_1 = Color::fromIntToHex($colors[0]);
$color_2 = Color::fromIntToHex($colors[1]);
var_dump($color_1, $color_2);