Ознакомьтесь с функциями GD .
Вот решение , перебирающее пиксели , чтобы найти наиболее распространенный цвет. Тем не менее, вы можете просто изменить размер изображения до 1 пикселя - это должен быть средний цвет - верно?
Пример метода 1px ( теперь включает тестовую страницу ):
<?php
$filename = $_GET['filename'];
$image = imagecreatefromjpeg($filename);
$width = imagesx($image);
$height = imagesy($image);
$pixel = imagecreatetruecolor(1, 1);
imagecopyresampled($pixel, $image, 0, 0, 0, 0, 1, 1, $width, $height);
$rgb = imagecolorat($pixel, 0, 0);
$color = imagecolorsforindex($pixel, $rgb);
?>
<html>
<head>
<title>Test Image Average Color</title>
</head>
<body style='background-color: rgb(<?php echo $color['red'] ?>, <?php echo $color['green'] ?>, <?php echo $color['blue'] ?>)'>
<form action='' method='get'>
<input type='text' name='filename'><input type='submit'>
</form>
<img src='<?php echo $filename ?>'>
</body>
</html>
Ниже приведен пример кода для нахождения среднего цвета border , аналогичного первой ссылке. Для вашего использования это может работать лучше ( Я знаю, что этот код неэффективен, но, надеюсь, за ним легко следовать ):
<?php
$filename = $_GET['filename'];
$image = imagecreatefromjpeg($filename);
$width = imagesx($image);
$height = imagesy($image);
for($y = 0; $y < $height; $y++){
$rgb = imagecolorat($image, 0, $y);
$color = imagecolorsforindex($image, $rgb);
$red += $color['red'];
$green += $color['green'];
$blue += $color['blue'];
$rgb = imagecolorat($image, $width -1, $y);
$color = imagecolorsforindex($image, $rgb);
$red += $color['red'];
$green += $color['green'];
$blue += $color['blue'];
}
for($x = 0; $x < $height; $x++){
$rgb = imagecolorat($image, $x, 0);
$color = imagecolorsforindex($image, $rgb);
$red += $color['red'];
$green += $color['green'];
$blue += $color['blue'];
$rgb = imagecolorat($image, $x, $height -1);
$color = imagecolorsforindex($image, $rgb);
$red += $color['red'];
$green += $color['green'];
$blue += $color['blue'];
}
$borderSize = ($height=$width)*2;
$color['red'] = intval($red/$borderSize);
$color['green'] = intval($green/$borderSize);
$color['blue'] = intval($blue/$borderSize);
?>
Обновление : я добавил более усовершенствованный код на github . Это включает в себя как усреднение границы, так и усреднение всего изображения. Следует отметить, что изменение размера до 1px гораздо более дружественно к ресурсам, чем сканирование каждого пикселя (хотя я не проводил никаких тестов в реальном времени), но код показывает три различных метода.