Forum Programmation.shell Modifications images

Posté par  .
Étiquettes : aucune
1
3
fév.
2010

Bonjour,
Je suis nouveau sur ce site car j'étais un malade de Windows, puis mon docteur m'a prescrit un traitement sous linux. Depuis quelques temps je prends de l'Ubuntu 9.10 et je commence à aller beaucoup mieux. Toutefois quelques problèmes subsistent et je craint une rechute. Plus sérieusement, voici mon problème. J'ai créé un script pour mettre des images (uniquement celles qui sont au format .jpg) en taille vignette. Mais j'ai aussi des images dans un autre format (png, gif, bitmat, etc...). Je n'arrive pas à mettre une ligne de script qui affiche un message d'erreur si le fichier n'est pas en .jpg.
Voici mon script.


#!/bin/sh

#Pour vérifier s'il y a au moins 1 argument.
if [ $# -eq 0 ];

then

echo "Veuillez entrer un nom de fichier"

else

#Pour déclarer le répertoire en cours comme lieu d'éxécution.
cd ./

fichiers=*.jpg

fi

fichiers=$1

#Pour vérifier le format du fichier.

if [ `basename $1 .jpg` = `basename $1` ];

then

echo "Ce fichier n'est pas au format jpg"

fi

#Pour modifier et renommer les fichiers demandés.

for I in $fichiers

do

convert $@.jpg -resize 40% little_$@.jpg;

echo "Fichier $I modifié et renommé en little_$I.jpg"

done


Si quelqu'un a une idée ce serait super.

Amitiés à toute et à tous
  • # re

    Posté par  . Évalué à 4.

    on va garder celui là car le sujet est mieux structuré.

    voici la reponse que j'avais formulé sur l'autre sujet

    je crois que tu as aussi un autre probleme, c'est que la touche "entrée" de ton clavier semble bloquée...

    pour savoir quel est le type de fichier tu as la commande file
    ~$ file Images/colis-A.jpg
    Images/colis-A.jpg: JPEG image data, JFIF standard 1.01


    mon fichier colis-A peut tres bien etre nommé colis-A.pdf,
    ca reste un jpg...
    et file pourra te le dire.

    sinon si tu veux simplement le faire sur l'extension
    il faut probablement executer les deux commandes et stocker le resultat dans 2 variables
    puis tester si les deux sont egales
    test1= basename $1
    test2 = basename $1 .jpg
    if [ 'test1' -eq 'test2']...
    • [^] # Re: re

      Posté par  (site web personnel) . Évalué à 1.

      convert(1) n'est-il pas assez intelligent pour détecter le format d'entrée ? Par ailleurs, un fichier JPEG peut avoir une extension quelconque, comme l'a dit NeoX, mais même sans chercher bien loin : .jpg, .jpeg, .JPG, .Jpeg, etc. Pour répondre à la question, case permet de faire du matching limité :
      $ while read line; do
      > case $line in
      > *.[Jj][Pp][Gg]|*.[Jj][Pp][Ee][Gg])
      > echo "C'est un fichier JPEG (peut-être)"
      > ;;
      > *)
      > echo "C'est pas du JPEG"
      > ;;
      > esac
      > done
      blah.png
      C'est pas du JPEG
      blah.jpeg
      C'est un fichier JPEG (peut-être)
      blah.JPG
      C'est un fichier JPEG (peut-être)
      blah.jpeg2000
      C'est pas du JPEG
      Sinon, dans sa forme le script me paraît améliorable :
      #Pour vérifier s'il y a au moins 1 argument.
      if [ $# -eq 0 ];then
      echo "Veuillez entrer un nom de fichier"
      else
      #Pour déclarer le répertoire en cours comme lieu d'éxécution.
      cd ./
      fichiers=*.jpg
      fi
      fichiers=$1
      Ceci signifie : si l'utilisateur ne donne aucun argument, alors on le dispute (mais on continue), sinon on met dans $fichiers la liste des .jpg du dossier. Mais de toute façon, à la ligne suivante on met dans $fichiers le premier argument (qui est peut-être vide, puisque si l'utilisateur n'a pas donné d'arguement on a décidé de continuer).
      #Pour déclarer le répertoire en cours comme lieu d'éxécution.
      cd ./
      Que veux-tu faire là ? cd . est toujours un no-op (sauf cas très particulier). Donc ceci peut partir.
      • [^] # Re: re

        Posté par  (site web personnel) . Évalué à 2.

        Je me réponds à moi-même : convert est effectivement assez intelligent pour retrouver le format des images.

        frlanw0f03384:/tmp/a$ file *
        Blue-5_4.jpg: JPEG image data, JFIF standard 1.02
        fossil.png: PNG image data, 128 x 128, 8-bit/color RGB, non-interlaced
        pattern-clouds.svg: XML 1.0 document text
        frlanw0f03384:/tmp/a$ for I in *; do convert -resize 40% $I little_$I; done
        convert: no image vector graphics `little_pattern-clouds.svg'.
        frlanw0f03384:/tmp/a$ file *
        Blue-5_4.jpg: JPEG image data, JFIF standard 1.02
        fossil.png: PNG image data, 128 x 128, 8-bit/color RGB, non-interlaced
        little_Blue-5_4.jpg: JPEG image data, JFIF standard 1.01
        little_fossil.png: PNG image data, 51 x 51, 16-bit/color RGB, non-interlaced
        pattern-clouds.svg: XML 1.0 document text

        Bon, convert a buté sur le fichier SVG, il a dit qu'il ne savait pas comment le gérer et n'a rien fait. C'est pas le comportement qui t'intéresse ?
  • # find

    Posté par  (site web personnel) . Évalué à 2.

    la commande find peut être intéressante aussi, par exemple quelque chose comme ça : for jpg in $(find /tmp/images/ -iname "*.jpg"); do convert -resize 40% "$jpg" "little_$(basename $jpg)"; done;
  • # Merci à tous. Vraiment super cette communauté Linux

    Posté par  . Évalué à 2.

    J' ai vu toutes vos solutions et vais les tester. Bien sur je vous ferai part des résultats (bien que ces résultats dépendent avant tout de moi. Et oui ! Si votre solution est bonne mais que je me plante ça ne fonctionnera pas. Soyez indulgents car ce n'est pas évident de se lancer dans Linux et les scripts à mon age (56 ans). En fait je me suis aperçu que ce problème était mineur puisque le shell me renvoi un message d'erreur même si ce n'est pas celui que je voudrais. Par contre je me suis aussi aperçu que si je voulais modifier la taille de la vignette il fallait que je modifie mon script. Donc il me paraît intéressant de mettre le % en paramètre et non pas dans le script afin d'avoir le choix de la taille. J'avais pensé à un echo "usage : ..." Avez vous une idée ? Amicalement
  • # Modifications images

    Posté par  . Évalué à 1.

    En fait echo "usage | ..."

    J'ai vu ça dans des exemples mais je ne sais pas à quoi ça sert.
  • # Modifications images

    Posté par  . Évalué à 1.

    Pour fred ton script me semble intéressant:
    $ while read line; do
    > case $line in
    > *.[Jj][Pp][Gg]|*.[Jj][Pp][Ee][Gg])
    > echo "C'est un fichier JPEG (peut-être)"
    > ;;
    > *)
    > echo "C'est pas du JPEG"
    > ;;
    > esac
    > done
    blah.png
    C'est pas du JPEG
    blah.jpeg
    C'est un fichier JPEG (peut-être)
    blah.JPG
    C'est un fichier JPEG (peut-être)
    blah.jpeg2000
    C'est pas du JPEG
    
    
    Mais je le place où dans mon script?
    
    Amicalement
    • [^] # Re: Modifications images

      Posté par  (site web personnel) . Évalué à 1.

      Ça donnerait quelque chose comme :
      fichier=$1
      
      # Si l'utilisateur donne quelque chose qui ressemble à un pourcentage, on l'utilise
      # Sinon, on prend 40 par défaut
      if [ $2 -ge 0 -a $2 -le 100 ]; then
          taille=$2
      else
          taille=40
      fi
      
      case $fichier in
      *.[Jj][Pp][Gg]|*.[Jj][Pp][Ee][Gg])
          convert -resize "$taille%" "$fichier" "little_$fichier"
          ;;
      *)
          echo $fichier ne semble pas être un fichier JPEG
          echo Utilisation :
          echo $0 image.jpg [taille]
          echo Si taille (en %) n'est pas donnée ou n'est pas comprise entre 0 et 100, utilise une
          echo valeur par défaut de 40.
          exit 1
          ;;
      esac
      Utilisation : mon_script image.jpg [taille]. Par contre : ce script ne retaille qu'une seule image, c'est dommage. Une solution serait de prendre la taille comme le premier argument (mais dans ce cas la taille n'est plus optionnelle), puis de looper sur les arguments. Je te laisse ça en exercice ?
  • # Modifier un fichier image

    Posté par  . Évalué à 1.

    Bon j'ai trouvé.
    #!/bin/bash
    
    #######################################################################
    # Reduire un fichier donne en parametre  a un taux donné en paramètre #
    #
    
    # Si nb param < 2 => sortie
    if [ $# -lt 2 ]
    then 
    	echo "Usage : $0 fichier.jpg taux(%)"
    	exit 1
    fi
    
    # Si le nom passé en paramètre ne correspond pas à un fichier lisible => sortie
    if [ ! -r $1 ]  # -r : fichier existe et est accessible en lecture, rappel : ! : négation
    then 
    	echo "$1 n'existe pas ou n'est pas accessible en lecture";
    	exit 2;
    fi
    
    # Si le fichier ne possède pas l'extension jpg => sortie
    
    echo $1 | grep -i "jpg$" > /dev/null
    
    if [ $? != "0" ] 	# si la dernière commande s'est exécutée avec succès ($1 fini bien par jpg)
    then 
    	echo "Le fichier ne possède pas l'extension jpg";
    	exit 3;
    fi
    
    
    # Conversion
    NOM=`basename $1`
    DIR=`dirname $1`
    NOM_SORTIE=$DIR/little_$NOM
    
    convert -resize $2% $1 $NOM_SORTIE 2> /dev/null # si erreur, les messages d'erreur de la commande convert sont redirigés vers la corbeille
    
    #si erreur sur la dernière commande (test de $?)
    if [ $? != "0" ]
    then 
    	echo "Conversion echouée (mauvais format ?) ";
    	exit 4
    else 	echo "Reduction de $1 à $2% vers le fichier $NOM_SORTIE effectuée" 
    fi
    
    exit 0
    
    
    Merci à tous ceux qui m'ont répondu.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.