2009-11-17 13 views
9

Ich möchte Bilder in Divs oder Tabellen als Hintergründe anzeigen. Wenn die Bilder nicht groß genug sind, muss ich die äußerste Farbe dieses Bildes finden und sie auf den Hintergrund der enthaltenden div- oder Tabellenzelle anwenden.Get image color

Hat jemand Erfahrung damit? In PHP. Ich bin ein Noob also bitte erklären. Vielen Dank

+0

Haben Sie jemals funktioniert? –

Antwort

23

Überprüfen Sie die GD functions.

Hier ist eine Lösung von looping through the pixels die häufigste Farbe zu finden. Aber you could just resize the image to 1 pixel - das sollte die durchschnittliche Farbe sein - oder?

Ein Beispiel für die 1px-Methode (jetzt einschließlich 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='<?php echo $filename ?>'> 
    </body> 
</html> 

Hier einige Beispiel-Code die durchschnittliche Grenze Farbe, ähnlich dem ersten Link zu finden. Für Ihre Verwendung kann dies besser funktionieren (Ich weiß, dass dieser Code ineffizient ist, aber hoffentlich ist es einfach folgen):

<?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 more refined code on github. Dies umfasst sowohl die Mittelung der Grenze als auch die Mittelung des gesamten Bildes. Es sollte beachtet werden, dass die Größenanpassung auf 1 Pixel viel ressourcenschonender ist als das Scannen jedes Pixels (obwohl ich keine Echtzeittests durchgeführt habe), aber der Code zeigt die drei verschiedenen Methoden.

+0

Lief ein paar Tests des Resize-Codes und es scheint zu funktionieren. –

+0

Sorry, aber ich bin ein Anfänger, wie würde ich das auf ein div für die Hintergrundfarbe anwenden? Irgendeine Idee Tim. Danke, dass Sie das auch vorgeschlagen haben, es bedeutet viel. –

+0

Oh lass mich sehen, ob ich das funktioniert, DANK TIM –