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

Shell et commandes GNU Discussion :

Script en shell, redimensionner des images


Sujet :

Shell et commandes GNU

  1. #1
    Futur Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Script en shell, redimensionner des images
    Bonjour.
    Je suis en train de travailler sur un script qui modifie la taille des images de mon fichier Images/
    Il est possible que l'erreur que m'affiche mon shell soit très simple à résoudre, mais je commence à fatiguer.

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #! /bin/bash
    find *.png > mypicts
    NBPICT=`wc -l mypicts | cut -d' ' -f1`
    i=1
    while (i < "$NBPICT")
    {
    IMG=`sed -n ${i} mypicts`
    convert -resize 50% $IMG $(echo $IMG | sed s/\.png/_mini\.png/)
    i++
    };
    rm mypicts
    Et voici le beau message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ./picture_script: line 12: syntax error: unexpected end of file
    A SAVOIR

    La commande convert n'est disponible qu'après avoir téléchargé le paquet "imagemagick"

    J'ai Mandriva comme distribution, en VM


    EXPLICATION DU CODE :

    Donc au départ je trouve tout les .png de mon dossier Images/, et je les met dans un fichier nommé "mypicts"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    find *.png > mypicts
    Ensuite, je compte le nombre d'images que contient mon dossier à l'aide du dossier nouvellement créé, et j'enregistre ce nombre dans la variable NBPICT :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    NBPICT=`wc -l mypicts | cut -d' ' -f1`
    Puis vient ma boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    i=1
    while (i < "$NBPICT")
    {
    IMG=`sed -n ${i} mypicts`
    convert -resize 50% $IMG $(echo $IMG | sed s/\.png/_mini\.png/)
    i++
    };
    Ma boucle est délimitée par ma variable NBPICT :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    while (i < "$NBPICT")
    Je crée une variable IMG qui sera réinitialisée à chaque tour de boucle par le contenu d'une ligne de mon fichier "mypicts" (ainsi, au premier tour, IMG vaudra le nom de ma première image, au deuxième, le nom de la seconde, etc...) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    IMG=`sed -n ${i} mypicts`
    Puis je change la taille de l'image :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    convert -resize 50% $IMG $(echo $IMG | sed s/\.png/_mini\.png/)
    Enfin je supprime le fichier "mypicts" pour pouvoir travailler sereinement la prochaine fois que je voudrait utiliser mon script (si j'ai moins d'images qu'avant par exemple) :

    LES PROBLEMES

    J'ai testé chacune de ses commandes séparément, ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    convert -resize 50% $IMG $(echo $IMG | sed s/\.png/_mini\.png/)
    fonctionne, ainsi que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    IMG=`sed -n s{i} mypicts`
    C'est ma boucle en elle même qui me pose problème,

    1ère question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    NBPICT=`wc -l mypicts | cut -d' ' -f1`
    NBPICT est un nombre, ou bien une chaine de caractère coupée, si c'est un nombre, alors il n'y a pas de problème à l'utiliser dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    while (i < "$NBPICT")
    en revanche, si c'est une chaine de caractère tronquée, son utilisation dans "while" peut être compromettante.

    2ème question :

    Si le problème ne vient pas de là, d'où peut-il provenir ? (boucle mal faite peut-être).

  2. #2
    Invité
    Invité(e)
    Par défaut
    Qu'elle est la commande sur la ligne 12 ?

    Sinon, pour ta boucle c'est pas plutôt un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while [ $i -lt $NBPICT ]
    do
       ton code
    done
    Essaie aussi de mettre un ; à la fin de ta dernière commande.
    Est-ce que bash a besoin d'un saut de ligne à la fin du fichier ou non !!!

  3. #3
    Rédacteur/Modérateur
    Avatar de Winnt
    Homme Profil pro
    budget et contrôle de gestion
    Inscrit en
    Décembre 2006
    Messages
    1 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : budget et contrôle de gestion
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 978
    Points : 4 130
    Points
    4 130
    Par défaut
    Salut,

    Je ferais plutot comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #!/bin/bash
    for var in $(ls *.png)
    do
    convert -resize 50% $var $var"_mini.png"
    done
    rename "s/png_mini/_mini/" *.png
    EDIT : Je n'ais pas tester (je suis au taf) mais ca devrait marcher.
    Winnt
    Merci de lire les règles du forum LaTeX et Qu'est ce qu'un ECM ?.
    N'hésitez pas à parcourir la FAQ la réponse y est peut-être déjà.
    Pensez au bouton si votre problème est résolu.


    C'est en Linuxant qu'on devient .... geek
    Et c'est en LateXant qu'on devient flemmard
    Mon blog tout neuf.
    Articles : présentation de la distribution Gentoo, Les index sous LaTeX et leur personnalisation.

  4. #4
    Futur Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Winnt Voir le message
    Salut,

    Je ferais plutot comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #!/bin/bash
    for var in $(ls *.png)
    do
    convert -resize 50% $var $var"_mini.png"
    done
    rename "s/png_mini/_mini/" *.png
    EDIT : Je n'ais pas tester (je suis au taf) mais ca devrait marcher.
    Effectivement ce code marche.
    En revanche, je ne suis pas fana du code des autres. (Je préfère coder avec des choses que je comprend).
    Je vais donc essayer de décortiquer les étapes de ton code, mais j'aimerai que tu me dise si je l'ai bien interprété ou non :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for var in $(ls *.png)
    Tu liste tout mes .png dans var

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    convert -resize 50% $var $var"_mini.png"
    La variable var est redimentionnée et en même temps renommée avec -mini.png à la fin.
    C'est là que je cloche.
    Si je comprend bien, ce code travaille sur une seule variable, qui est le condensé de TOUTE mes images !
    Si c'est le cas c'est absolument énorme, car on à juste à travailler une fois sur une seule variable, qui représente toute mes images ?!
    Si je pouvais vraiment avoir plus d'explications ici, je t'en serai vraiment reconnaissant !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    rename "s/png_mini/_mini/" *.png
    Je ne vois pas l'interet de cette ligne, vu que notre image redimentionnée est automatiquement renommée lors de son redimentionnement.

  5. #5
    Futur Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par cheval_boiteux Voir le message
    Qu'elle est la commande sur la ligne 12 ?

    Sinon, pour ta boucle c'est pas plutôt un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while [ $i -lt $NBPICT ]
    do
       ton code
    done
    Essaie aussi de mettre un ; à la fin de ta dernière commande.
    Est-ce que bash a besoin d'un saut de ligne à la fin du fichier ou non !!!
    Je n'ai pas de ligne 12 :/
    J'ai modifié ma boucle comme suis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    while [ $i -lt $NBPICT ]
    do
    IMG=`sed -n ${i} mypicts`
    convert -resize 50% $IMG $(echo $IMG | sed s/\.png/_mini\.png/)
    i++
    done
    avec en message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    convert: option requires an argument `-resize'.
    ./picture_script: line 9: i++: command not found
    sed: -e expression n°1, caractère 1: commande manquante
    Le message d'erreur reste le même avec un ";" à la fin de "i++" ou de "done".
    Je ne comprend pas que "i++" ne soit pas reconnue.
    Même si le code plus haut marche, je trouverais intéressant d'avoir une alternative, même si ma méthode n'est pas la plus efficace, juste histoire de dire qu'elle marche
    En tout cas, merci de ta réponse qui m'a rappelée quelques règles des boucles

  6. #6
    Rédacteur/Modérateur
    Avatar de Winnt
    Homme Profil pro
    budget et contrôle de gestion
    Inscrit en
    Décembre 2006
    Messages
    1 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : budget et contrôle de gestion
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 978
    Points : 4 130
    Points
    4 130
    Par défaut
    Salut,

    Je vais essayer d'expliquer clairement mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/bin/bash
    for var in $(ls *.png)
    do
    convert -resize 50% $var $var"_mini.png"
    done
    rename "s/png_mini/_mini/" *.png
    Liste les fichiers d'extension png ligne à ligne et envoie chaque ligne dans la variable var.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    convert -resize 50% $var $var"_mini.png"
    $var"_mini.png" concaténe le contenu de la variable var et la chaine "_mini.png" (ex. : convert -resize 50% toto.png toto.png_mini.png).


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rename "s/png_mini/_mini/" *.png
    Rennome les fichiers d'extension png en remplacant "png_mini" par "_mini".
    D'ailleurs une correction à apporter (désolé une petite erreur)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rename "s/\.png_mini/_mini/" *.png
    Boucle sur le contenu de "$(ls *.png)"

    Voilà j'espère que mes explications seront clair.
    Winnt
    Merci de lire les règles du forum LaTeX et Qu'est ce qu'un ECM ?.
    N'hésitez pas à parcourir la FAQ la réponse y est peut-être déjà.
    Pensez au bouton si votre problème est résolu.


    C'est en Linuxant qu'on devient .... geek
    Et c'est en LateXant qu'on devient flemmard
    Mon blog tout neuf.
    Articles : présentation de la distribution Gentoo, Les index sous LaTeX et leur personnalisation.

  7. #7
    Futur Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Merci pour l'explication, effectivement, c'est beaucoup plus clair.
    Je doit avoir vraiment l'esprit étriqué mais je trouve ça toujours aussi énorme de pouvoir agir sur mes fichiers de cette manière (pour moi, avant que je ne voit ton code, pour travailler fichier à fichier, il fallait aller sur chaque fichier un par un, connaitre le nombre de fichier, et les lister un par un, d'où mon code complexe qui se base sur ce principe) !
    Franchement c'est génial de voir qu'on puisse faire beaucoup plus simple !

    Merci d'avoir ouvert les frontières de mon esprit

    Est très sympa aussi dans le sens où la boucle fait le travail sans qu'on lui donne de conditions, en gros elle vas redimentionner jusqu'à la dernière ligne de $var.

    (Avant de voir ça, et de me rendre compte que ça marche, j'aurais fait quelque chose du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    do
        ...
    while [ i -lt VALEUR ]
    done

  8. #8
    Rédacteur/Modérateur
    Avatar de Winnt
    Homme Profil pro
    budget et contrôle de gestion
    Inscrit en
    Décembre 2006
    Messages
    1 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : budget et contrôle de gestion
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 978
    Points : 4 130
    Points
    4 130
    Par défaut
    Salut,

    Oui Bash offre des possibilités très intéressantes.
    Couplé avec sed, awk,... ca devient royal
    Winnt
    Merci de lire les règles du forum LaTeX et Qu'est ce qu'un ECM ?.
    N'hésitez pas à parcourir la FAQ la réponse y est peut-être déjà.
    Pensez au bouton si votre problème est résolu.


    C'est en Linuxant qu'on devient .... geek
    Et c'est en LateXant qu'on devient flemmard
    Mon blog tout neuf.
    Articles : présentation de la distribution Gentoo, Les index sous LaTeX et leur personnalisation.

Discussions similaires

  1. Réponses: 11
    Dernier message: 23/08/2007, 17h26
  2. Redimensionner des images et les sauvegarder
    Par hellspawn_ludo dans le forum Windows Forms
    Réponses: 3
    Dernier message: 21/08/2007, 15h43
  3. redimensionner des images
    Par moabomotal dans le forum Modules
    Réponses: 4
    Dernier message: 21/11/2006, 11h12
  4. [Traitement d'image] Redimensionner des images
    Par mireilleturrel dans le forum Webdesign & Ergonomie
    Réponses: 3
    Dernier message: 15/05/2006, 11h24

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