calcul de teinte

calcul de teinte - PHP - Programmation

Marsh Posté le 09-01-2007 à 01:12:04    

Salut a tous,
 
Existe t-il un script php gratuit permettant de calculer la teinte principale d'une image?
En gros le script devra detecter la couleur la plus majoritaire sur l image...
 
merci!

Reply

Marsh Posté le 09-01-2007 à 01:12:04   

Reply

Marsh Posté le 09-01-2007 à 05:34:29    

bah c tout con
tu lit tout les pixels  
tu fait une moyenne puis tu ramenne ca sur une teinte (conversion 16 couleurs)
(voir phpgd)
et daboard pourquoi tu veux faire ca?

Reply

Marsh Posté le 09-01-2007 à 10:47:24    

pas sûr que ça soit le bon algo. Imagines une image avec 1/3 de blanc et 2/3 de noir. La couleur majoritaire est le noir et non un espèce de gris issu de la moyenne des 2 teintes...
Moi, je serais parti sur un histogramme et je regarderais la couleur qui a le plus grand effectif.

Reply

Marsh Posté le 09-01-2007 à 12:02:58    

oui ben alors ca serait plutot
tu lit tout les pixels  
tu ramenne ca sur une teinte (conversion 16 couleurs) et tu prend la valeur la plus frequente
(ce que rufo a dit quoi)

Reply

Marsh Posté le 09-01-2007 à 12:04:03    

nope rufo il vaut mieux justement que le resultat soit du gris, imagine, une image de 30 couleurs differents plutot dans les verts et une seule couleur orange majoritaire en nombre de pixel et pof la teinte est declarer comme orange alors que le vert est majoritaire.
 
Je vais creuser du cote de ce qu a dit red faction , mais si kk un connait un script javascript ou phph tout pret ben wi merci je veut bien

Reply

Marsh Posté le 09-01-2007 à 12:40:59    

je t'ai deja dit cest tout simple
 
faudrait apprendre a chercher sous google
 
php gd sous google me renvoit ca:
http://lu.php.net/gd
 
 

Code :
  1. $old_image =imagecreatefromjpeg("./test.jpg" );
  2. $old_x = imagesx($old_image);
  3. $old_y = imagesy($old_image);
  4. $_rgb=0
  5. for( $x = 0; $x < $old_x; $x++){
  6.    for( $y = 0; $y < $old_y; $y++){   
  7.        $_rgb=$_rgb+ ImageColorAt($old_image, $x, $y);    //original color
  8.      
  9.      
  10.    }
  11. }
  12. $_rgb/=($old_x*$old_y);
  13. (peut etre que $r_rgb nest pas assez grand pour tout contenir....)


 
 
 
poru ramener a 16 couleurs:
 
 
 

Code :
  1. $R = ($_rgb >> 16) & 0xFF;                //split 24 bit color in RGB values
  2. $G = ($_rgb >> 8) & 0xFF;
  3. $B = $_rgb & 0xFF;
  4. $c=4*(convertirenint(($R+64)/128))+2*(convertirenint(($G+64)/128)+1*(convertirenint(($B+64)/128));
  5. apres $c te donnera qqch compris entre 0 et 7
  6. 0= noir
  7. 1= bleur foncé


 
merci de poster ta solution complete, et si ca marche , une fois tout terminé
 
(si c pas trop demander)


Message édité par red faction le 09-01-2007 à 13:08:20
Reply

Marsh Posté le 09-01-2007 à 13:02:58    

ca roule red faction je revient avec le script qui marche une fois que j ai terminer ca (je connaissais pas phpgd)
encore merci!

Reply

Marsh Posté le 09-01-2007 à 13:27:00    

krifur a écrit :

nope rufo il vaut mieux justement que le resultat soit du gris, imagine, une image de 30 couleurs differents plutot dans les verts et une seule couleur orange majoritaire en nombre de pixel et pof la teinte est declarer comme orange alors que le vert est majoritaire.
 
Je vais creuser du cote de ce qu a dit red faction , mais si kk un connait un script javascript ou phph tout pret ben wi merci je veut bien


 
c'est pour ça qu'il faut définir des plages. Faut pas faire un histogramme en 16 millions de couleurs, bien entendu. Donc tu vas regrouper dans une plage les verts clairs, une autre plage les verts foncés, et ainsi de suite... La taille des plages va dépendre de la précision de la teinte que tu veux au final...

Reply

Marsh Posté le 09-01-2007 à 15:34:12    

Citation :

$_rgb=$_rgb+ ImageColorAt($old_image, $x, $y);


cette instruction dépasse le temps d'execution de script par default(30 sec) ca marche mais cela prends trop de ressource pour le petit proc qu y a sur mon serveur, a la limite je vais essayer de le coder en bash...
Donc je vais abandonner a moins qu il existe une methode plus rapide en php ou javascript pour calculer la teinte globale d'une image...(je pensais a lire qu 1 ligne sur 2 mais c pas genial)
 
meric qd meme pour l aide

Reply

Marsh Posté le 09-01-2007 à 16:05:20    

tu upload des images de quelle taille????
evidemenet si c du 1600*1200 :/
 
puis c pour utiliser dans quel contexte?

Reply

Marsh Posté le 09-01-2007 à 16:05:20   

Reply

Marsh Posté le 09-01-2007 à 16:08:03    

sinon tu peut aller voir du coté de imagecopyresampled (http://fr.php.net/manual/en/functi [...] ampled.php)  qui redimensionne une image a la bonne taille
 
il suffit de la redimensionner en 1x1 et de lire le pixel qui reste


Message édité par red faction le 09-01-2007 à 16:09:28
Reply

Marsh Posté le 09-01-2007 à 16:35:07    

mon image etait en 960 x 1280 ^^
c'est vrai que c etait beaucoup et comment c malin de redimmensionner l image j y avait pas penser  :o.
Le but est tout simple faire un site d image et lors de l upload de photo par des utilisateurs le formulaire declenche un script qui calcule la teinte de l image et le stocke dans la base de donnes de l image , ce qui permettra plus tard de classer les differentes images par teinte.
Un peu comme sur ce site mais en plus simple:
 
http://www.fotolia.fr/cat1/1000000 (menu de gauche affiner par couleur)
 
tu crois que si je redimmensionne l image en 1x1 j aurais la teinte globale de l image :heink: ?
J ai dut mal a y croire, je vais faire des test avec differentes tailler pour voir les resultats.
 
merci

Reply

Marsh Posté le 09-01-2007 à 16:36:43    

si ca marche pas tu peut toujours redimensioner en 64x64 ou 32x32 par exmple puis faire le calcul que je tai donné plus haut...

Reply

Marsh Posté le 09-01-2007 à 17:10:03    

ca a l air de fonctionner:
 
en total rgb je trouve:
 
200x200: 4174062.26837
64x64: 4173461.21875  
32x32: 4172516.29036  
 
en 1x1 ca donne rien,je continuerai les tests plus tard , je doit y aller , mais merci beaucoup ca a l air de fonctionner comme ca!
et merci pour les bons bouts de code ^^
 
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed