Ich möchte Bilder in Divs oder Tabellen als Hintergrund anzeigen. Wenn die Bilder nicht groß genug sind, muss ich die äußerste Farbe dieses Bildes finden und sie auf den Hintergrund des enthaltenden div oder der Tabellenzelle anwenden.
Hat jemand Erfahrung damit? Bei PHP. Ich bin ein Noob, also bitte erklären. Ich danke dir sehr
Besuche die GD-Funktionen.
Hier ist eine Lösung von Schleife durch die Pixel um die häufigste Farbe zu finden. Jedoch, Sie könnten das Bild einfach auf 1 Pixel verkleinern – das sollte die durchschnittliche Farbe sein – richtig?
Ein Beispiel für die 1px-Methode (jetzt inklusive Testseite):
<?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="https://stackoverflow.com/questions/1746530/<?php%20echo%20$filename%20?>">
</body>
</html>
Hier ist ein Beispielcode zum Ermitteln des Durchschnitts Grenze Farbe, ähnlich dem ersten Link. Für Ihre Verwendung funktioniert dies möglicherweise besser (Ich weiß, dass dieser Code ineffizient ist, aber hoffentlich ist er einfach zu befolgen):
<?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);
?>
Aktualisieren: Ich habe einige verfeinerter Code auf github. Dies umfasst sowohl die Mittelung des Randes als auch die Mittelung des gesamten Bildes. Es sollte beachtet werden, dass die Größenänderung auf 1 Pixel weitaus ressourcenschonender ist als das Scannen jedes Pixels (obwohl ich keine Echtzeittests durchgeführt habe), aber der Code zeigt die drei verschiedenen Methoden.
.