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

Определение доминирующего цвета фотографии дает возможность реализовать поиск изображений по цвету или сделать цветные подложки под изображения, пока они загружаются в браузере. Ниже представлены несколько методов определения цвета, который наиболее часто встречается на картинке.

1

Самый простой способ получить основной цвет – сжать изображение до размера 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;
PHP

Если нужно несколько цветов, то можно ресайзить изображение до размеров 4x4, 8x8 и т.д.

Результат роботы скрипта:

Загрузите свои фото:

2

Перебор пикселей и вычисление среднего цвета, данный метод даёт более светлые тона.

$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;
PHP

Результат роботы скрипта:

Загрузите свои фото:

3

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);
PHP

Без 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);
PHP

Результат роботы скрипта:

Загрузите свои фото:

14.12.2021, обновлено 05.04.2022
9534

Комментарии 1

Ruslan Braun Ruslan Braun
12 апреля 2023 в 16:23
Библиотека не рабочая, с гит хаба подгружается всякий хлам, фатальные ошибки на php 7.4

, чтобы добавить комментарий.

Другие публикации

PHP-класс для создания миниатюр изображений
PHP Thumb – это библиотека, основанная на PHP GD и предназначена для создания превью изображений для каталогов, товаров...
49470
+13
Загрузка файлов на сервер PHP
В статье приведен пример формы и php-скрипта для безопасной загрузки файлов на сервер, возможные ошибки и рекомендации при работе с данной темой.
72264
+22
Изображения WebP в GD PHP
WebP – формат сжатия изображений, разработанный Google. Имеет более меньший размер файла по сравнению с JPG, но не поддерживается продуктами Apple.
19222
+6
Генерация QR-кода в PHP
Вопрос генерации QR-кодов в PHP достаточно освещён, есть много библиотек, одной из них является «PHP QR Code» – быстрый и легкий класс, рассмотрим его применение совместно с графической библиотекой...
66880
+18
Генерация счета на оплату PDF PHP
С помощью расширения dompdf можно легко сформировать PDF файл. По сути, dompdf - это конвертер HTML в PDF который...
66107
+33
Пример парсинга html-страницы на phpQuery
phpQuery – это удобный HTML парсер взявший за основу селекторы, фильтры и методы jQuery, которые позволяют...
63034
+26