2009-11-17 5 views
9

Je souhaite afficher des images à l'intérieur de divs ou de tableaux en arrière-plan. Si les images ne sont pas assez grandes, je vais devoir trouver la couleur la plus externe de cette image et l'appliquer à l'arrière-plan de la cellule div ou table contenant.Obtenir la couleur de l'image

Est-ce que quelqu'un a de l'expérience avec ça? En PHP. Je suis un noob alors s'il vous plaît expliquer. Merci beaucoup

+0

Avez-vous déjà travaillé? –

Répondre

23

Consultez le GD functions.

Voici une solution de looping through the pixels pour trouver la couleur la plus commune. Cependant, you could just resize the image to 1 pixel - qui devrait être la couleur moyenne - non?

Un exemple de la méthode 1px (maintenant, y compris la page de test):

<?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> 

Voici quelques exemples de code pour trouver la moyenne frontière couleur, similaire au premier lien. Pour votre utilisation cela peut fonctionner mieux (Je sais que ce code est inefficace, mais nous espérons qu'il est facile de suivre):

<?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); 

?> 

Mise à jour: Je mets un peu more refined code on github. Cela inclut à la fois la moyenne de la bordure et la moyenne de l'image entière. Il est à noter que le redimensionnement à 1px est bien plus convivial que l'analyse de chaque pixel (même si je n'ai pas effectué de tests en temps réel), mais le code montre les trois méthodes différentes.

+0

Ran quelques tests du code de redimensionnement et il semble fonctionner. –

+0

Désolé mais je suis un débutant, comment est-ce que j'appliquerais ça à un div pour la couleur de fond? Toute idée Tim. Merci d'avoir suggéré cela aussi, cela signifie beaucoup. –

+0

Oh laissez-moi voir si je peux obtenir ce travail, MERCI TIM –

Questions connexes