Я хочу отображать изображения внутри divs или таблиц в качестве фона. Если изображения недостаточно велики, мне нужно будет найти внешний цвет этого изображения и применить его на фоне содержащейся ячейки div или таблицы.
У кого-нибудь есть опыт? В PHP. Я ноб, поэтому, пожалуйста, объясните. огромное спасибо
Проверьте функции 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>
Вот пример кода для поиска среднего цвета границы , аналогичного первой ссылке. Для вашего использования это может работать лучше ( я знаю, что этот код неэффективен, но, надеюсь, легко следовать ):
<?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 гораздо более ресурсоемкое, чем сканирование каждого пикселя (хотя я не запускал никаких тестов в реальном времени), но в коде действительно показаны три разных метода.