Недавно накидал скрипт на 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;
}