2009-11-17 12 views
9

Desidero visualizzare le immagini all'interno di div o tabelle come sfondi. Se le immagini non sono abbastanza grandi, avrò bisogno di trovare il colore più esterno di quell'immagine e applicarlo allo sfondo del div contenente o della cella di tabella.Ottieni il colore dell'immagine

Qualcuno ha esperienza con questo? In PHP. Sono un noob quindi per favore spiega. Grazie mille

+0

Hai mai funzionato? –

risposta

23

Scopri il GD functions.

Ecco una soluzione di looping through the pixels per trovare il colore più comune. Tuttavia, you could just resize the image to 1 pixel - che dovrebbe essere il colore medio - giusto?

Un esempio del metodo di 1px (ora anche di test pagina):

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

Ecco qualche esempio di codice per trovare la media confine colore, simile al primo collegamento. Per l'utilizzo da questo può funzionare meglio (so che questo codice è inefficiente, ma si spera che sia facile da seguire):

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

?> 

Aggiornamento: ho messo un po 'more refined code on github. Ciò include la media del bordo e la media dell'intera immagine. Va notato che il ridimensionamento a 1px è molto più favorevole alle risorse rispetto alla scansione di ogni pixel (anche se non ho eseguito test in tempo reale), ma il codice mostra i tre diversi metodi.

+0

Effettuato alcuni test del codice di ridimensionamento e sembra funzionare. –

+0

Scusate ma sono un principiante, come potrei applicarlo a un div per il colore di sfondo? Qualche idea, Tim. Grazie per averlo suggerito, significa molto. –

+0

Oh fammi vedere se riesco a farlo funzionare, GRAZIE TIM –

Problemi correlati