Calcolare in PHP i colori di un'immagine


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