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

Tkinter Python Discussion :

Actualisation de l'image dans le Canvas


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2016
    Messages : 15
    Par défaut Actualisation de l'image dans le Canvas
    Bonjour à tous,

    C'est la première fois que je post sur le forum, si je m'exprime mal ou que je n'ai pas posté au bon endroit, je m'en excuse d'avance.

    Un ami et moi avons développé un petit programme Python permettant de légères modifications sur des images. Lorsque une modification est effectuée sur l'image (par exemple, l'application d'un filtre bleu), la modification s'effectue bien.
    Cependant, si une nouvelle modification est apportée (filtre rouge cette fois-ci), le programme ne prend pas en compte le filtre bleu précédemment appliqué.
    Nous avons essayé d'arranger cela en vain...
    La partie de code actualisant l'image dans le Canvas ressemble à cela : (il y a beaucoup de commentaires mais cela nous permet de nous y retrouver)


    Code : 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
    19
    20
    21
    22
    def ActualisationDeImage () :
        Fond.destroy()                              # On detruit l'ancienne image
     
        NouvelleImage = Image.open(fichierSortie)   # Le paramètre image représente l'image que l'on veux insérer
     
        NouvellePhoto = ImageTk.PhotoImage(NouvelleImage)   # Avec la fonction ImageTk.PhotoImage (), on peut créer une image compatible Tkinter,
                                                            # qu'on pourra afficher dans un Canvas par la méthode create_image(position, **options)
                                                            # où position réprésente les 2 coordonnées du coin en haut à gauche de l'image,
                                                            # sachant que l'image sera aussi positionnée par rapport au paramètre anchor
                                                            # qui par défaut vaut CENTER. 
     
        NouveauFond = Tk.Canvas(fenetre, width = NouvelleImage.size[0], height = NouvelleImage.size[1])
     
                                                            # Le Canvas ne s'adapte pas par défaut à la place que prennent 
                                                            # les éléments que l'on à dessiner dedans. Donc si l'image que 
                                                            # l'on veux insére est trop grande, on peut être assuré qu'elle sera
                                                            # entièrement visible en renseignant les paramètres width et height à la création du Canvas.
     
        NouveauFond.create_image(0, 0, anchor = Tk.NW, image=NouvellePhoto)  # Pour que l'image soit positionnée en haut à gauche du Canvas,
                                                                             # on doit utiliser la position 0, 0 et rajouter le paramètre anchor = Tk.NW
        NouveauFond.place (x=2, y=2) # On place le Nouveau Fond
        NouveauFond.mainloop()       # On ouvre la Nouvelle Image

    Une seconde question, l'une des fonctionnalités du programme est une modification de la luminosité. Pour que cette modification soit plus agréable pour l'utilisateur, nous avons choisi d'utiliser un curseur.
    Cependant, celui met énormément de temps avant d'apparaître (tant qu'il n'est pas apparu, on voit uniquement un cadre noir). Est-ce normal ou est ce qu'il y a un moyen plus 'stable' ?
    La partie du code liée au curseur est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #Création d'un widget Luminosité ()
    Luminosite=Label(fenetre, text=" Luminosite ", font="Comic 10")
    Luminosite.place (x=695, y=35)
     
    Valeur = StringVar() # On definit Valeur
    Valeur.set(0)        # On donne la valeur que prendra le curseur au départ
     
        # Création d'un widget Curseur
    echelle = Scale(fenetre,from_=-150,to=250, resolution=25, orient=HORIZONTAL, length=250, width=10, tickinterval=50, variable=Valeur, command=luminosite)
    echelle.place(x=780, y=15)


    Voilà, désolé nous sommes débutants et il est difficile au début de se confronter à ce genre d'obstacle ^^'


    Merci d'avance et bonne journée.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 743
    Par défaut
    Salut,

    Citation Envoyé par flolievre Voir le message
    Cependant, si une nouvelle modification est apportée (filtre rouge cette fois-ci), le programme ne prend pas en compte le filtre bleu précédemment appliqué.
    Ce que vous montrez se contente d'afficher le contenu d'une image lue dans un fichier...
    Le contenu du fichier est ce que vous avez sauvegardé après les éventuelles transformations que vous avez appliquées (mais qu'on ne va pas deviner).


    Citation Envoyé par flolievre Voir le message
    Une seconde question, l'une des fonctionnalités du programme est une modification de la luminosité. Pour que cette modification soit plus agréable pour l'utilisateur, nous avons choisi d'utiliser un curseur.
    Cependant, celui met énormément de temps avant d'apparaître (tant qu'il n'est pas apparu, on voit uniquement un cadre noir). Est-ce normal ou est ce qu'il y a un moyen plus 'stable' ?
    Tout dépend de comment vous avez codé çà... et la encore, impossible de tirer quoi que ce soit du code que vous montrez.

    Citation Envoyé par flolievre Voir le message
    Voilà, désolé nous sommes débutants et il est difficile au début de se confronter à ce genre d'obstacle ^^'
    Le premier obstacle est d'arriver à vous faire comprendre. Le plus simple est de poster un petit exemple (du code) qui permette de reproduire ce que vous constatez.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2016
    Messages : 15
    Par défaut
    Un exemple d'une fonction de modification (le filtre bleu) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def couleurCyan () :                
        for y in range(H): # on balaie toutes les lignes de l’image source, de 0 à H-1
            for x in range(L): # pour chaque ligne on balaie toutes les colonnes, de 0 à L-1
                pixel = im1.getpixel((x,y)) # en stockant le pixel (x,y) dans une liste p à trois éléments
                                    # p[0] est la composante rouge, p[1] la composante verte, et p[2] la composante bleue
                r = 0
                v = pixel[1]  
                b = pixel[2]
                im2.putpixel((x,y),(r,v,b)) # on écrit le pixel modifié sur l’image destination
     
        im2.save(fichierSortie) # on stocke l’image résultante
        ActualisationDeImage () # On actualise l'image qui se trouve dans le Canvas
    Est-ce la partie qui pourrait être modifiée pour que les autres modifications soient prises en compte après celles-ci ?

    Pour la luminosité, la fonction qui s'en occupe est la suivante :
    Code : 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
    19
    20
    21
    22
    23
    def luminosite(nouvellevaleur):     
        for y in range (H):
            for x in range (L):
                pixel = im1.getpixel((x, y))
     
                R = pixel[0]+ int(nouvellevaleur)   # On augmente de int(nouvellevaleur) la valeur des pixels Rouge (Valeur comprise entre [0,255])
                V = pixel[1]+ int(nouvellevaleur)   # On augmente de int(nouvellevaleur) la valeur des pixels Vert (Valeur comprise entre [0,255])
                B = pixel[2]+ int(nouvellevaleur)   # On augmente de int(nouvellevaleur) la valeur des pixels Bleu (Valeur comprise entre [0,255])
     
                if R < 0: R = 0         # Comme la valeur doit-être comprise entre [0,255], il faut donc suprimer les valeurs inférieurs à 0 et
                if R > 255: R = 255     # supérieurs à 255
     
                if V < 0: V = 0
                if V > 255: V = 255
     
                if B < 0: B = 0
                if B > 255: B = 255
     
                im2.putpixel ((x,y) ,(R,V,B))
     
     
        im2.save(fichierSortie) # on stocke l’image résultante
        ActualisationDeImage ()
    Et le curseur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #Création d'un widget Luminosité 
    Luminosite=Label(fenetre, text=" Luminosite ", font="Comic 10")
    Luminosite.place (x=695, y=35)
     
    Valeur = StringVar() # On definit Valeur
    Valeur.set(0)        # On donne la valeur que prendra le curseur au départ
     
        # Création d'un widget Curseur
    echelle = Scale(fenetre,from_=-150,to=250, resolution=25, orient=HORIZONTAL, length=250, width=10, tickinterval=50, variable=Valeur, command=luminosite)
    echelle.place(x=780, y=15)
    J'espère que ce sont les bonnes parties de code :/

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 743
    Par défaut
    Quelle est la taille de vos images?
    Ou appelez vous widget.quit pour sortir (et terminer) l'appel à ActualisationDeImage (qui fait .mainloop())?

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2016
    Messages : 15
    Par défaut
    Les images font toutes du 600*600 et font entre 100 et 200Ko.

    Nous n'utilisons widget.quit à aucun moment dans le code. Mainloop() n'est présent qu'à deux endroits dans le code :
    - dans la fonction ActualisationDeImage
    - A la fin du code pour fermer la fenêtre

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 743
    Par défaut
    Citation Envoyé par flolievre Voir le message
    Les images font toutes du 600*600 et font entre 100 et 200Ko.
    Comme vous ne postez pas un code qui permette de reproduire quoi que ce soit, essayez avec des images plus petites.

    Citation Envoyé par flolievre Voir le message
    Nous n'utilisons widget.quit à aucun moment dans le code. Mainloop() n'est présent qu'à deux endroits dans le code
    Si vous n'appelez jamais .quit, l'appel à .mainloop() ne se termine pas et ActualisationDeImage non plus.
    A chaque appel d'ActualisationDeImage, vous ne libérez pas la mémoire consommée par l'appel précédent.... in fine çà plantera et avant, çà va ramer.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. afficher une image dans un canvas
    Par alex.blais dans le forum Tkinter
    Réponses: 4
    Dernier message: 08/12/2007, 18h29
  2. afficher une image dans un canvas
    Par Arrakis dans le forum Tkinter
    Réponses: 1
    Dernier message: 05/03/2007, 13h22
  3. placer plusieurs images dans un canvas
    Par philac dans le forum Tkinter
    Réponses: 6
    Dernier message: 07/11/2006, 00h43
  4. actualisation d'une image dans ma page
    Par jack_1981 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 01/08/2006, 14h45
  5. [Tkinter]Image dans un Canvas
    Par Slade991 dans le forum Tkinter
    Réponses: 2
    Dernier message: 10/06/2006, 14h42

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