Ottieni il colore dell'image

Voglio 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'image e applicarlo allo background del div contenente o della cella di tabella.

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

Scopri le funzioni GD .

Ecco una soluzione di looping dei pixel per trovare il colore più comune. Tuttavia, puoi ridimensionare l'image a 1 pixel , che dovrebbe essere il colore medio, giusto?

Un esempio del metodo 1px (che ora include la pagina di 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> 

Ecco alcuni esempi di codice per trovare il colore del bordo medio, simile al primo link. Per il tuo utilizzo questo potrebbe 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 aggiunto un codice più raffinato su github . Ciò include la media del bordo e la media dell'intera image. Va notato che il ridimensionamento a 1px è molto più favorevole alle risorse rispetto alla scansione di each pixel (anche se non ho eseguito test in tempo reale), ma il codice mostra i tre diversi methods.