Sprawdź GD functions.
Oto rozwiązanie polegające na znalezieniu najczęstszego koloru w rozmiarze looping through the pixels. Jednak you could just resize the image to 1 pixel - to powinien być średni kolor - prawda?
Przykładem metody 1px (teraz tym testowej stronie):
<?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>
Oto niektóre przykładowy kod dla znalezienia przeciętną granicy kolor, podobny do pierwszego ogniwa. Do użytku może działać lepiej (wiem, kod ten jest nieskuteczny, ale mam nadzieję, że to jest łatwe do naśladowania):
<?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);
?>
Aktualizacja: kładę trochę more refined code on github. Obejmuje to uśrednianie granicy i uśrednianie całego obrazu. Należy zauważyć, że zmiana rozmiaru na 1px jest znacznie bardziej przyjazna dla zasobów niż skanowanie każdego piksela (chociaż nie przeprowadziłem żadnych testów w czasie rzeczywistym), ale kod pokazuje trzy różne metody.
Czy to działa? –