Buongiorno, avrei un problema abbastanza complesso, è possibile individuare in un immagine tramite php quale è il colore predominante? esistono funzioni che svolgono questo lavoro?
Grazie mille
Buongiorno, avrei un problema abbastanza complesso, è possibile individuare in un immagine tramite php quale è il colore predominante? esistono funzioni che svolgono questo lavoro?
Grazie mille
nessuno mi sa dare una mano?
ho trovato questo sito dove riporta esattamente il tipo di ricerca per colore che vorrei realizzare, spero che qualcuno di voi mi possa aiutare su come realizzare una cosa simile.
http://www.istockphoto.com/file_search.php
Grazie mille
hai provato a fare un upload su quel sito ?
Magari in fase di inserimento ti chiede di selezionare il colore a percentuale maggiore....
Perchè altrimenti con php non saprei proprio come fare....
anche se fosse manuale la selezione io avrei bisogno dif arla automatica, qualcuno sa darmi qualche indicazione al riguardo.
Grazie mille
Usi le librerie gd e memorizzi pixel per pixel qual'è il colore poi vedi qual'è il più usato.
int imagecolorat ( resource image, int x, int y )
ti ritorna l'indice per un punto dell'immagine.
array imagecolorsforindex ( resource image, int index )
ti ritorna una array associativo con i valori umanamente comprensibili (RGB) per l'indice.
Con un ciclo attraversi l'immagine con queste funzioni e hai finito
Lungo le due rive del fiume gelato si stendeva la cupa e tetra foresta di abeti, dai quali il vento aveva appena spazzato il manto di brina. Nella luce crepuscolare quegli abeti neri e sinistri sembravano inclinarsi l'uno verso l'altro. Un silenzio minaccioso incombeva sul paesaggio, privo di qualsiasi segno di vita o di movimento, e desolato e freddo al punto da non poter ispirare che un solo sentimento: quello della più triste malinconia. E nello stesso tempo pareva che da quel paesaggio trapelasse una specie di riso, un riso ben più spaventoso di qualsiasi malinconia o tristezza, un riso tragico, come quello di una sfinge, un riso agghiacciante più della brina e che rammendava l'incombere minaccioso dell'ineluttabile. Era la saggezza potente e impenetrabile dell'eternità che irrideva alla vita, alla sua futilità e agli sforzi degli uomini.
io comprerei un server di scorta....
facciamo 2 veloci calcoli.. un'immagine da 1024x768 ha 786432 pixel.
Non ho mai provato, ma ciclare i 786432 elementi di un array credo che sia un po' troppo oneroso per un server web... (soprattutto quando è la funzione principale di un sito)
Beh.. ha chiesto come fare con php... gli ho rispostoOriginariamente inviato da gianiaz
io comprerei un server di scorta....
facciamo 2 veloci calcoli.. un'immagine da 1024x768 ha 786432 pixel.
Non ho mai provato, ma ciclare i 786432 elementi di un array credo che sia un po' troppo oneroso per un server web... (soprattutto quando è la funzione principale di un sito)
Altri modi (a meno che non si metta a lavorare con i byte) non ne vedo e cmq sarebbero più lenti.
Cmq anche tu sei un po' esagerato
Non è mica detto che deve lavorare per forza con immagini 1024 e non è nemmeno detto che sia la funzione principale del sito.. magari fa una ricerca ogni due o tre giorni :maLOL:
Dai cmq.. scherzi a parte.. chi se ne frega del 1024.. questo test può farlo su una versione ridotta dell'immagine, tanto percentualmente dovrebbe essere più o meno rispettato l'ordine.
Poi non è detto che deve avere un array da WxH elementi.
Quando individua un valore lo aggiunge alla lista. Basta per esempio usare un array associativo.
Per esempio
e via dicendo..Codice PHP:
$r = 255;
$b = 255;
$g = 255;
$colori[$r_$b_$g]++;
Quindi, se sicuramente in una foto i colori si ripetono abbastanza spesso, in un immagine grafica ancora di più, direi che si troverà con un array più ridotto.
Inoltre potrebbe anche considerare l'immagine con colori 16bit come fanno su quel sito.
Questo restinge a massimo 65k colori, quindi male che vada 65k indici.
Poi basta trovare il valore più alto nell'array e dall'indice si può risalire al colore.
Se ancora è lento si possono usare anche altre tecniche.. per esempio si può approssimare un colore a quello più prossimo, o ai 5 più prossimi (non credo che da quel softwae dipenda il futuro dell'umanità.. vero? ).
Si può fare abweb, si può fare.
Non farti prendere dal pessimismo di gianiaz
Lungo le due rive del fiume gelato si stendeva la cupa e tetra foresta di abeti, dai quali il vento aveva appena spazzato il manto di brina. Nella luce crepuscolare quegli abeti neri e sinistri sembravano inclinarsi l'uno verso l'altro. Un silenzio minaccioso incombeva sul paesaggio, privo di qualsiasi segno di vita o di movimento, e desolato e freddo al punto da non poter ispirare che un solo sentimento: quello della più triste malinconia. E nello stesso tempo pareva che da quel paesaggio trapelasse una specie di riso, un riso ben più spaventoso di qualsiasi malinconia o tristezza, un riso tragico, come quello di una sfinge, un riso agghiacciante più della brina e che rammendava l'incombere minaccioso dell'ineluttabile. Era la saggezza potente e impenetrabile dell'eternità che irrideva alla vita, alla sua futilità e agli sforzi degli uomini.
Originariamente inviato da IroN@xiD
Non farti prendere dal pessimismo di gianiaz
No, però se ci pensi deve comunque ciclare un numero di elementi enorme.
Sono pessimista perchè ho pensato che se vuole sviluppare una funzione del genere probabilmente il suo scopo è quello di sviluppare un sito simile a quello che ci ha linkato.. e quindi se non è la funzione principale è una delle principali
Beh, si
Sono un sacco di operazioni.
Più che altro il problema sono le dimensioni dell'immagine.
Tuttavia ridimensionandola si dovrebbe rientrare in un limite accettabile di operazioni.
Può fare dei test e decidere a che dimensione ridimensionare per avere un carico accettabile.
Dipende come sempre dall'host.. è che io sono abituato bene a lavoro. Ho un dual xeon con 2gb di ram come webserver
In realtà cmq non c'è molto da fare per php se ci pensi..
Le librerie gd sono scritte in c quindi quando invoca le loro funzioni tutto viene eseguito a C-velocità. A php rimane solamente il compito di mettere nell'array e trovare poi qual'è il valore maggiore.
Eseguire questo script
sul mio portatile impiega meno di un secondo.Codice PHP:
$colori = Array();
for($x = 0; $x < 65000; $x++) $colori[rand(1,255).'_'.rand(1,255).'_'.rand(1,255)]++;
$maxval = 0;
foreach($colori as $val) if($val>$maxval) $maxval = $val;
echo $maxval;
Quindi il problema non è tanto ciclare l'array con php.
Bisogna vedere quanto veloce è gd... anzi..
dato che ci sono e sono curioso scrivo io il codice ad abweb (fanno 15€ iva esclusa )
Impiega (sul mio portatile 1400mhz celeron M, 736mb RAM ) con apache2 e php5 circa 6secondi per un 1024, 2-3 secondi per un 640x480.Codice PHP:
<?
set_time_limit(0);
$st = time();
$im = imagecreatefromjpeg('file.jpg');
list($w, $h) = getimagesize('file.jpg');
$colori = Array();
for($x = 0, $y = 0; $x < $w && $y < $h; $x++) {
$i = imagecolorat( $im, $x, $y);
/*
$r = ($i >> 16) & 0xFF;
$g = ($i >> 8) & 0xFF;
$b = $i & 0xFF;
echo "RGB($r,$g,$b)";
*/
$c = imagecolorsforindex($im,$i);
//print_r($c); exit;
$colori[$c['red'].'_'.$c['green'].'_'.$c['blue']]++;
if($x==$w-1) {
$x = 0;
$y++;
}
}
$maxval = 0;
foreach($colori as $idx => $val) {
if($val>$maxval) {
$maxval = $val;
$maxidx = $idx;
}
}
echo $maxidx, " => ", $maxval, "
";
list($r,$g,$b) = explode('_',$maxidx);
echo "RGB($r,$g,$b) in ".(time()-$st)."s.";
?>
Pensavo molto peggio.. è più che accettabile sia come carico che come tempo di esecuzione.
Lungo le due rive del fiume gelato si stendeva la cupa e tetra foresta di abeti, dai quali il vento aveva appena spazzato il manto di brina. Nella luce crepuscolare quegli abeti neri e sinistri sembravano inclinarsi l'uno verso l'altro. Un silenzio minaccioso incombeva sul paesaggio, privo di qualsiasi segno di vita o di movimento, e desolato e freddo al punto da non poter ispirare che un solo sentimento: quello della più triste malinconia. E nello stesso tempo pareva che da quel paesaggio trapelasse una specie di riso, un riso ben più spaventoso di qualsiasi malinconia o tristezza, un riso tragico, come quello di una sfinge, un riso agghiacciante più della brina e che rammendava l'incombere minaccioso dell'ineluttabile. Era la saggezza potente e impenetrabile dell'eternità che irrideva alla vita, alla sua futilità e agli sforzi degli uomini.