Come Calcolare i colori di un'immagine da PHP?
Se si volesse sapere il numero di colori che ha un'immagine, tanto da capire se questa è corrotta oppure priva di contenuto riconoscibile, possiamo usare questa funzione.
Impostando determinati parametri, avremo il controllo della funzione per specificare i numero di colori, pixel e il tempo massimo di ricerca.
<?php
//immagine da analizzare
$immagine="test.jpg";
//offset pixel controllati (1 li controlla tutti altrimenti ne controlla 1 ogni $offset)
$offset=2;
//numero mimimo di colori per considerare l'immagine buona
//consigliato non meno di 3: nel caso di video server ritorna immagine grigia con banda nera e scritta bianca (3 colori)
$minColor=10;
//tempo massimo oltre il quale stoppo l'analisi dell'immagine e la considero errata (in secondi)
//0 se non voglio dare un limite
$maxTime=10;
/** AVVIO ANALISI **/
echo "Analisi immagine in corso...n";
$risultato=detectColors($immagine,$offset,$minColor,$maxTime);
if(is_array($risultato))
{
echo "Trovati ".count($risultato["palette"])." colorin";
echo "Tempo di analisi: ".$risultato["time"]." secondi n";
echo "Dettaglio colori trovati in $risultato[palette]n";
}
else
echo $risultato."n";
/** METODI **/
function detectColors($image, $num, $level, $maxTime=0)
{
$start=time();
$level = (int)$level;
$palette = array();
$size = getimagesize($image);
if(!$size)
return "dimensione immagine non valida";
switch($size['mime'])
{
case 'image/jpeg':
$img = imagecreatefromjpeg($image);
break;
case 'image/png':
$img = imagecreatefrompng($image);
break;
case 'image/gif':
$img = imagecreatefromgif($image);
break;
default:
return "tipo immagine non valida";
}
if(!$img)
return "impossibile leggere l'immagine";
/** CONTROLLO APPROFONDITO DI TUTTI I PIXEL **/
// scorro tutti i pixel per recuperarne il colore
for($i=0; ($i<$size[0] && count($palette)<$num); $i+=$level)
{
for($j=0; ($j<$size[1] && count($palette)<$num); $j+=$level)
{
// se è stato impostato un tempo massimo di esecuzione e lo sto superando allora esco dal ciclo
if($maxTime!=0 && (time()-$start)>$maxTime)
return "limite di tempo raggiunto ($maxTime sec)";
$color = analizingPixel($img, $i, $j);
$palette[$color] = isset($palette[$color]) ? ++$palette[$color] : 1;
}
}
return array("time"=>(time()-$start),"palette"=>$palette);
}
function RGBToHex($r, $g, $b)
{
$hex.= str_pad(dechex($r), 2, "0", STR_PAD_LEFT);
$hex.= str_pad(dechex($g), 2, "0", STR_PAD_LEFT);
$hex.= str_pad(dechex($b), 2, "0", STR_PAD_LEFT);
return $hex;
}
function analizingPixel($img, $x, $y)
{
$thisColor = imagecolorat($img, $x, $y);
$rgb = imagecolorsforindex($img, $thisColor);
//versione non arrotondata
$color = RGBToHex($rgb['red'], $rgb['green'], $rgb['blue']);
//versione arrotondata
//$color = sprintf('%02X%02X%02X', (round(round(($rgb['red'] / 0x33)) * 0x33)), round(round(($rgb['green'] / 0x33)) * 0x33), round(round(($rgb['blue'] / 0x33)) * 0x33));
return $color;
}
?>
Per provare lo Script basta chiamare da linea di comando il nome del file php indicando dove si trova l'immagine.
[root@utente cartella]# php colors.php