IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Traitement d'images Discussion :

algorithme de imagefill en php


Sujet :

Traitement d'images

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 90
    Points : 50
    Points
    50
    Par défaut algorithme de imagefill en php
    Bonjour, je cherche l'algorithme de imagefill, implémenté en php. Je veux drie par là que je uis désireux de reprendre cet algorithme pour le modifier, et que donc je cherche un code php utilisable (non pas la fonction imagefill qui est dans la librairie gd).

    Merci d'avance pour votre aide.

  2. #2
    Membre expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Points : 3 919
    Points
    3 919
    Par défaut
    Salut,

    Je pense que personne ne t'a répondu parce que tu cherches un algorithme en php utilisable... Je pense donc que peut-être que tu aurais plus de succés en déplacant ton post chez les mordus de php
    Enfin, c'est toi qui vois... personnellement, je ne connais pas cet algorithme, mais je me suis permis de te donner ce petit conseil car ça mange pas de pain les conseils, voila...

    Bonne journé a toi
    Pas de questions technique par MP, les forums sont là pour ça.

  3. #3
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Voici la fonction que j'ai réalisé pour modifier une couleur dans une image...
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    function ChangeColor($file,$Color=0,$ReplaceColor=0){ 
     $infos=GetImageSize($file);
     $Width=$infos[0]; 
     $Height=$infos[1]; 
     if($infos[2]==1) $img=ImageCreateFromGif($file);else
     if($infos[2]==2) $img=ImageCreateFromJpeg($file);else
     if($infos[2]==3) $img=ImageCreateFromPng($file);else
     if($infos[2]==6) $img=ImageCreateFromWBmp($file);else
     $img=ImageCreate($file);
     $imgNew=ImageCreateTruecolor($Width,$Height); 
     for($y=0;$y<$Height;$y++) 
      for($x=0;$x<$Width;$x++){
        $c=ImageColorAt($img,$x,$y); 
         if($c!=$Color) ImageSetPixel($imgNew,$x,$y,$c);
         else ImageSetPixel($imgNew,$x,$y,$ReplaceColor);
      }
     return $imgNew; 
    }
    Exemple :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $file='test.jpg'; 
    $newfile='newtest.jpg';
    if(file_exists($file)){ 
     $imgNew=ChangeColor($file,0xFFFFFF,0x808080);
     Imagepng($imgNew,$newfile);
     echo '<img src="'.$newfile.'" alt=""/>'; 
    }else echo 'Image source introuvable!';
    De retour parmis vous après 10 ans!!

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 90
    Points : 50
    Points
    50
    Par défaut
    Merci.
    Désolé de ne pas être venu plus tôt, mais je n'avais pas reçu de mail me disant que j'avais une réponse.

    Ceci dit, ton code marche bien mais ne rempli pas son role. Pour l'instant, il remplie strictement toute l'image en remplacant les couleurs.

    Je veux dire par la que imagefill ne rempli pas un cercle si il est fermé.

    Et en fait c'est tout là mon problème: je sais faire une boucle pour parcourir TOUS les pixels d'une image, mais en faire une pour ne remplir que ceux qui se toucent, a la façon d'un pot de peinture... pff, impossible.

    enfin merci de ton aide.

    C'est où la section pour les mordus de php? est-ce qu'un modo peut déplacer ma demande?

    Merci a tous.

  5. #5
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    L'algo s'appelle "flood fill". Il est expliqué sur le lien wikipedia.

    Il y a plein d'implementation possible. La plus perfomante s'appelle "Scanline Fill" (exemple en C#)
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 90
    Points : 50
    Points
    50
    Par défaut
    oui, j'ai vu l'algo sur wikipedia.
    Oui, j'ai vu l'exemple pour l'implémenter en c#
    maintenant, je ne sais pas le faire en php. J'ai fait pas mal de php, mais je débute a peine avec le c, et je n'ai pas encore vu ni le c++ ni le c#, alors c'est un peu incompréhensible pour moi.

    Est-ce que vous pourriez me l'implémenter en php, si vous connaissez le c# et le php? Car je sais exactement qu'elle modif je ferais sur le code, mais encore faudrait-il que je l'ai.^^

    Merci pour votre aide.

  7. #7
    Membre éclairé
    Avatar de parp1
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    829
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Mai 2005
    Messages : 829
    Points : 872
    Points
    872
    Par défaut
    Citation Envoyé par bubuche87

    Est-ce que vous pourriez me l'implémenter en php.
    Merci pour votre aide.
    Tu as lu une chartre pour venir sur DVP.

    Tu as une solution qui te permet de changer les couleurs d'apres le code que je vois ci dessus.

    Tu sais donc maintenant changer les valeurs de couleur de pixel...

    a TOI d'implementer l'aglo.
    [SIZE="2"]Dis moi qui tu suis, je te dirais qui je Hais!
    Heureux est l'étudiant, qui comme la rivière suit son cours sans sortir de son lit

    Mon premier Tutoriel


    A 80% des cas je résouts mon problème en rédigeant une nouvelle discussion, du coup je ne poste que 20% de mes problèmes...

  8. #8
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Je suis d'accord avec parp1, il est plus intéressant pour toi de savoir le faire toi-même, surtout que tu as maintenant tous les éléments. Pour le moment, essaye simplement d'adapter ma fonction car Scanline n'existe pas en PHP, il faut recréer cette fonction... Pour l'instant, utilise les fonctions ImageColorAt pour obtenir la couleur d'un pixel et ImageSetPixel pour modifier la couleur. Bien entendu, nous t'aiderons si tu bloques sur un point précis...

    Allé, courage!
    De retour parmis vous après 10 ans!!

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 90
    Points : 50
    Points
    50
    Par défaut
    bon, j'ai commencé a m'y mettre.
    Mais je retombe sur un problème: en fait, imagecolorat renvoi un message d'erreur et non pas false si il est a l'extérieur de l'image (out of bounds).

    Bon, je me suis arreté au milieu du post, et je reviens maintenant.

    Je sais ce que fait imagecolorat, ainsi que imagesetpixel. J'ai fait pas mal de truc pour retoucher les images, et je suis assez a l'aise avec ces concepts.

    Maintenant, dès lors qu'il s'agit de récursive, je ne m'en sors plus. J'ai essayé de faire un cod, rien que pour pércourir, comme un serpent, une image (c'est a dire: je vais tout droit jusqu'a ce que je rencontre un obstacle, puis je descend d'une ligne, et je part dans l'autre sens jusqu'a ce que je rencontre un obstacle, ect.) mais je n'y arrive pas. Je vous met le code ici, comme ça vous pourrez constater que ça ne marche pas.

    function kimage_fill ($img, $x, $y, $color, $color_replace, $direction)
    {
    while (imagecolorat($img, $x, $y) === $color)//tant que le pixel est de la bonne couleur on le remplace par la couleur choisie, et on avance le pointeur d'un cran dans la direction choisie.
    {
    imagesetpixel ($img, $x, $y, $color_replace);
    $x += $direction;
    }
    if (imagecolorat($img, $x, ++$y) === $color)//quand la boucle précédente est fini, on est forcément a un moment ou il n'est plus possible d'aller plus loin. On regarde alors la ligne suivante, pour voir si on peut y aller. Si c'est la cas, on inverse la direction, et on repart.
    {
    $direction = -$direction;
    kimage_fill ($img, $x, $y, $color, $color_replace, $direction);
    }
    }

    ça ne marche pas. Sur une image entièrement blanche, cela me retourne un message d'erreur. En effet, cet merveilleuse fonction imagecolorat ne renvoi pas false dans le cas d'un dépassement d'image, mais un message d'erreur. Bon, on peut regler le problème en entourant l'image d'un bord noir.
    Ceci dit, une fois fait, cela me rempli les deux première ligne (en précisant une couleur a remplacer par du rouge, j'ai deux ligne rouges).

    Donc, même pour un truc aussi simple, cela ne marche pas.
    Et pas moyen de savoir ou ça plante (a quel itération) car je ne vois pas comment faire avec une récursive.
    Pour un système avec une seule propagation, je ne m'en sors déjà pas.
    D'ailleur, je subbodore que votre système ne marche pas dans un cas: celui d'une image blanche avec juste un "U" au millieu. en effet, lors qu'il passe au dessus du "U", il "referme la porte derrière lui" J'entend par la que comme il change la couleur au passage, il ne peut plus rentrer dans le U. Et comme il n'est pas arreté a ce moment là, cette partie resterai vide.
    Enfin, j'ai peut être mal compris.

    Ceci dit, cela fait plus d'un mois que je suis sur le problème, plusieurs heures par jour. Des fois je pleur devant mon ordi parceque je ne comprend pas pourquoi ça ne marche pas. La nuit, je rève que je suis poursuivi par un mur qui avance et qui rempli tout et que je me cahce dans un coin et qu'il ne me trouve pas parce qu'il n'a pas l'algorithme pour venir jusqu'ici. J'ai posté sur tellement de forum que je ne les compte plus.

    Bref, je suis tout a fait d'accord de continuer (j'apprendrai certainement des choses, et j'aime la programmation pour elle même), mais je ne peux pas promettre que j'arriverai jusqu'au bout.

  10. #10
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    dans le cas d'un dépassement d'image, mais un message d'erreur.
    Pourquoi veux-tu tester la couleur d'un pixel qui serait en dehors de l'image, c'est-à-dire qu'il n'existerait même pas ???
    Tu vois bien que dans mon code, je crée 2 variables pour stocker les dimensions de l'image à traîter... (Non?)

    • Tu dois choisir un point de coloriage, tu obtiens alors la couleur de référence
    • A partir de ce point, compare le reste de l'image en utilisant les fonctions Min() et Max() pour ne pas aller au-dela des dimensions de l'image :
    Pixel.X := Max(Min(Largeur-1, Pixel.X), 0) et
    Pixel.Y := Max(Min(Hauteur-1, Pixel.Y), 0)
    • Lorsque tu rencontres une couleur différente de la couleur de référence, tu stoppes la boucle avec Break (voir l'algo en détails)
    De retour parmis vous après 10 ans!!

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 90
    Points : 50
    Points
    50
    Par défaut
    bonjour.

    En effet, vouloir changer la couleur d'un pixel hors de l'image peut paraitre insensé, mais précisément si la fonction retournait false dans ce cas, on n'aurait pas a se soucier de vérifier qu'on est pas au bord de l'image, d'où un gain de temps énorme (sur une image de 100 sur 100, entièrement blanche, on ve se retrouver a vérifier 10.000 fois qu'on est pas au bord de x ni de y soit 20.000 vérifications. En php cela peut finir par faire très lourd).

    Ceci dit, j'ai trouvé une solution, autre (en trichant un peu).
    Je voulais a l'origine faire l'algorithme de imagefill pour pouvoir remplir une image sans s'arrèter sur une couleur légèrement différente (pour les jpeg). Je vais donc operer pas la méthode suivante:

    étape 1: je remplace toutes les couleurs de l'image proche de la couleur choisis par la couleur A(parcours simple de l'image avec deux boucle for imbriquées).
    étape 2: j'utilise le imagefill classique et je rempli un endroit avec la couleur B
    étape 3: je reparcours toute l'image que je viens de modifier, et quand je tombe sur un pixel de la couleur B je prend le pixel correspondant dans l'image d'origine et je le place dans une nouvelle image).

    De cette façon j'obtiens l'effet voulu.

    Dois-je marquer [résolu] devant le titre ou considérez vous que cela n'est pas le cas?

    dans tous cas, merci

  12. #12
    Membre éclairé
    Avatar de parp1
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    829
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Mai 2005
    Messages : 829
    Points : 872
    Points
    872
    Par défaut
    Pour le tag c'est a toi de voire s'il faut le mettre ou non.

    Si tu retombes sur un probleme rien de t'empeche de l'enlever pour reposter sur cette discution.
    [SIZE="2"]Dis moi qui tu suis, je te dirais qui je Hais!
    Heureux est l'étudiant, qui comme la rivière suit son cours sans sortir de son lit

    Mon premier Tutoriel


    A 80% des cas je résouts mon problème en rédigeant une nouvelle discussion, du coup je ne poste que 20% de mes problèmes...

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 90
    Points : 50
    Points
    50
    Par défaut
    Désolé je reviens dessus. ^^

    Bon, c'est beaucoup moins urgent car je peux le faire, mais ma méthode est très lourdes.

    Elle n'est vraiment pas appropriée.
    J'en ai encore besoin pour une autre chose, et même si je peux utiliser la même méthode, c'est un peu pénible ^^.

    donc si une ame charitable pouvait me le faire (je m'y essaye quand je l'aurai compris.).

    Merci

  14. #14
    Membre éclairé
    Avatar de parp1
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    829
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Mai 2005
    Messages : 829
    Points : 872
    Points
    872
    Par défaut
    Citation Envoyé par bubuche87
    Désolé je reviens dessus. ^^

    Bon, c'est beaucoup moins urgent car je peux le faire, mais ma méthode est très lourdes.

    Elle n'est vraiment pas appropriée.
    J'en ai encore besoin pour une autre chose, et même si je peux utiliser la même méthode, c'est un peu pénible ^^.

    donc si une ame charitable pouvait me le faire (je m'y essaye quand je l'aurai compris.).

    Merci

    Oui!

    Tu vas de dire, quelle réponse nulle. désolé, la réponse est a l'image de la question!

    Tu nous parles d'une méthodes etc etc ... mais on en sais pas de quoi, toujours ton holefille?

    Tu utlises quelle méthode? ..
    [SIZE="2"]Dis moi qui tu suis, je te dirais qui je Hais!
    Heureux est l'étudiant, qui comme la rivière suit son cours sans sortir de son lit

    Mon premier Tutoriel


    A 80% des cas je résouts mon problème en rédigeant une nouvelle discussion, du coup je ne poste que 20% de mes problèmes...

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 90
    Points : 50
    Points
    50
    Par défaut
    j'utilise la "méthode" décrite plus haut.

    en fait mon soucis c'est que je voudrais pouvoir faire une sorte d'image fill, mais en spécifiant mes propres conditions.

    Par exemple: pour enlever un fond bleu d'une image avec une personne dessus, le "test" consiste a regarder si la couleur est bleu (avec une gamme de couleur et tout, mais ça j'arrive a le faire).

    Pour obtenir un effet sin city, la condition est toujours d'être dans une certaine gamme de couleur.
    Mais si on ne veut colorer que les lèvres, obtenir une boucle de type "flood_fill" permet de ne pas colorer le visage. (dont la gamme de couleur peut être assez proche, sutout sur les pommetes.

    En bref, pouvoir se cantonner a une zone aurait du bon, mais je ne sais pas le faire.

    Ma "méthode" est écoeurante, mais marche. elle est égalementtrès lourde.

    étape 1: je remplace toutes les couleurs de l'image proche de la couleur choisis par la couleur A(parcours simple de l'image avec deux boucle for imbriquées).
    étape 2: j'utilise le imagefill classique et je rempli un endroit avec la couleur B
    étape 3: je reparcours toute l'image que je viens de modifier, et quand je tombe sur un pixel de la couleur B je prend le pixel correspondant dans l'image d'origine et je le place dans une nouvelle image).
    1) Je fais d'abord un parcours de TOUTE l'image, pixel à pixel, et je les remplace par du bleu (par exemple) si la condition est remplie.

    2) j'utilise la fonction qui existe dans php: imagefill (qui a comme condition stricte un changement de couleur). Ce faisant, je color un zone (la zone quiu m'interesse) en rouge.

    3) je reparcour toute l'image, et je remplace tous les pixels rouges par la couleur qui m'interesse.

    imagine une image présentant plusieurs plages blanche sur fond bleu (par exemple un ciel nuagé). La condition que je veux utiliser est "plutôt blanc" pour rendre l'un des nuages transparent
    La première étape change tous les nuages en bleu. Grace au imagefill, l'un deux, et seulement celui d'interet est changé en rouge.

    ensuite, lorsque je reparcours l'image, je ne tiens compte que des pixel qui ont été "marqués" par le rouge, et j'applique l'effet de mon choix:

    Cette méthode necessite bien sur de creer deux ressources d'images: une que
    l'on modifie et que l'on marque, et une qui reste "propre" jusqu'au traitement final (quand j'applique l'effet de mon choix a tous les pixels marqués rouges.)

    voila ma "méthode". Tu comprends pourquoi elle est très lourde (parcours de l'image, utilisation de imagefill, reparcours de l'image + deux ressources d'image en mémoire).

    Merci pour ton aide

Discussions similaires

  1. le code en PHP de l'algorithme de cryptographie RSA
    Par doud18 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 24/05/2010, 16h15
  2. Un algorithme d'affichage (en php/mysql)
    Par nico1214 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 05/06/2009, 10h32
  3. tableau php ver SQL | algorithme pour former l'arborescence
    Par spy74 dans le forum Algorithmes et structures de données
    Réponses: 0
    Dernier message: 17/01/2009, 12h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo