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

Python Discussion :

Réduction d'images automatique


Sujet :

Python

  1. #1
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut Réduction d'images automatique
    Bonjour,

    Je m'apprête à proposer ce bout de code que j'ai écrit dans le passé pas mal de fois mais jamais en prenant autant de temps.

    N'étant pas expert en Python, je me suis dit que je pouvais vous demander de critiquer à souhait le code avant de le mettre dans le sous-forum Contribuez :-)

    Le but du programme est de parcourir les sous-répertoires et de prendre chaque photo et de la réduire par 4.

    A la limite, je ferai bien une version qui ne modifie pas les fichiers de départ et qui créer une arborescence à côté copie conforme. Si quelqu'un a une idée comment faire en même temps facilement, je suis preneur :-)

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    import os.path
    from PIL import Image
     
    def find_directories(root = None):
        if not root:
            root = os.path.abspath(".")
     
        test_directories = []
     
        def accumulate_directories(arg, dirname, fnames):
            arg.append(dirname)
     
        os.path.walk(root, accumulate_directories , test_directories)
        for d in test_directories: yield d
     
    def run_resize(path):
     
        print "Handling " , path
        #Get current pwd
        pwd = os.path.abspath (".")
     
        #Go there
        os.chdir (path)
     
        #List of extensions
     
        #Get files 
        for f in os.listdir ("."):
            try:
                print os.path.abspath (".")
                im = Image.open(f)
                print f, " opened"
     
                width, height = im.size
                size = width/4, height/4
     
                im.thumbnail(size, Image.ANTIALIAS)
                im.save(f)
     
            except:
                im = 0
     
        #Come back
        os.chdir (pwd)
     
     
    def resize_all():
        for path in find_directories():
            yield run_resize, path
     
    if __name__ == "__main__":
        for call, elem in resize_all(): 
            run_resize (elem)

    Jc

  2. #2
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    Je suis plutôt py3, donc j’ai arrangé le code pour lui (devrait être à peu près compatible py2.7, cela dit…)*:

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    import os
    from PIL import Image
     
     
    def find_files(root = None, exts={".png", ".jpg"}):
        if not root:
            root = os.path.abspath(".")
     
        for rootdir, dirs, files in os.walk(root):
            for f in files:
                if os.path.splitext(f)[1] in exts:
                    yield os.path.join(root, rootdir), f
     
     
    def run_resize(path, f, new=False):
        org_file = os.path.join(path, f)
        if new:
            new_file = "_thumb".join(os.path.splitext(org_file))
        else:
            new_file = org_file
        print("Resizing", org_file, "to", new_file)
     
        try:
            im = Image.open(org_file)
     
            width, height = im.size
            size = width/4, height/4
     
            im.thumbnail(size, Image.ANTIALIAS)
            im.save(new_file)
     
        except Exception as e:
            print("Error while trying to resize", org_file, "!\n    ", e)
     
     
    def resize_all():
        for path, f in find_files():
            yield run_resize, (path, f)
     
     
    if __name__ == "__main__":
        for call, elem in resize_all(): 
            call(*elem)
    Code non-testé. J’ai principalement simplifié la génération des fichiers à traiter, en yieldant directement les fichiers images trouvés, plutôt que de passer par une double-détente dossier/fichier. Au passage, j’ai préféré os.walk (de toute façon, ow.path.walk a disparu en py3), plus pratique amha. Et j’ai rajouté l’option pour enregistrer les images redimentionnées sous un autre nom…

    Encore une fois, code non-testé, c’est juste du « comment je ferais*».

  3. #3
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 067
    Par défaut
    j'utiliserai imghdr pour filtrer les dossiers ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    from imghdr import what
    if what('mon image meme sans extension').lower() in ('jpg','png',etc ...): resize()

  4. #4
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Ben en fait je ne voulais pas utiliser les extensions ou les lister car sous linux, la casse est importante et du coup, moi j'ai des .png, .PNG, etc.

    Et je préférai simplement utiliser la librairie,
    Jc

  5. #5
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Je ne comprends pas pourquoi le générateur resize_all yield la fonction run_resize. Pourquoi cette gymnastique ?

    Je préfère le parcours unique des dossiers de mont29, c'est facile à adapter si tu veux enlever le test de l'extension. Dans ce cas je mettrais un deuxième except dans resize, qui ne catche que l'exception renvoyée par Image.open lorsque le type de fichier n'est pas reconnu, c'est plus propre que d'avaler toutes les exceptions sans distinction.

Discussions similaires

  1. [VBA-WORD] je voudrais insérer des images automatiquement.
    Par SharkAngel dans le forum VBA Word
    Réponses: 1
    Dernier message: 21/09/2006, 11h24
  2. Réduction d'images qui ne fonctionne pas
    Par mazou dans le forum Langage
    Réponses: 10
    Dernier message: 16/06/2006, 12h54
  3. Agrandissement/réduction d'image par AMR
    Par progfou dans le forum C
    Réponses: 2
    Dernier message: 13/05/2006, 19h09
  4. générer xml pour plusieurs images automatiquement
    Par tomagozo dans le forum XML/XSL et SOAP
    Réponses: 7
    Dernier message: 12/04/2006, 17h56
  5. Actualisation d'image automatique
    Par gromit83 dans le forum Général Conception Web
    Réponses: 3
    Dernier message: 01/02/2006, 08h16

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