5 votes

Bash script pour créer des vignettes personnalisées

J'ai besoin d'un bash script qui récupère toutes les images à l'intérieur d'un dossier spécifié ; prend leur résolution et si elle est inférieure au minimum alors ne fait rien, sinon crée une image thumb moyenne (200x150 pixels).

J'utilise Imagemagick sous Windows. Mais sur linux, je ne peux pas utiliser le même script donc je dois écrire un nouveau script.

Voici ce que j'ai trouvé jusqu'à présent.

#!/bin/bash
for files in /path/to/image/*
  do
       TESTFILE=`echo "$files" | sed 's/|/ /g' | xargs file -b | awk '{print $1}'`
       while read F
       CHECKSIZE=`file "$TESTFILE" -b | sed 's/ //g' | sed 's/,/ /g' | awk  '{print $2}' | sed 's/x/ /g' | awk '{print $1}'`
     if [ $CHECKSIZE -ge  200  ]; then
        convert -sample 200x150 "$F" "$F{_thumb}"
     fi
    done
  done

Mais lorsque j'exécute ce script, il ne me donne pas de vignettes ni d'erreurs. Je suis assez nouveau dans ces scripts.

Mise à jour :

Je suis arrivé à ce script, merci pour tout. Mais maintenant j'ai besoin d'une aide supplémentaire. Maintenant, je veux stocker la nouvelle image dans un dossier à l'intérieur du dossier images. Par exemple, /home/image est l'endroit où se trouvent tous les fichiers. Je veux que les images miniatures soient stockées dans /home/image/thumbs . Je veux aussi renommer les fichiers comme nom de fichier_thumb.jpg mais le problème avec le script suivant est qu'il est stocké en tant que nom de fichier.jpg_thumb .

#!/bin/bash
THUMBS_FOLDER=/home/temp/thumbs
for file in /home/temp/*
do
  # next line checks the mime-type of the file
  IMAGE_TYPE=`file --mime-type -b "$file" | awk -F'/' '{print $1}'`
  if [ x$IMAGE_TYPE = "ximage" ]; then
      IMAGE_SIZE=`file -b $file | sed 's/ //g' | sed 's/,/ /g' | awk  '{print $2}'`
      WIDTH=`identify -format "%w" "$file"`
      HEIGHT=`identify -format "%h" "$file"`           
      # If the image width is greater that 200 or the height is greater that 150 a thumb is created
     if [ $WIDTH -ge  201 ] || [ $HEIGHT -ge 151 ]; then
        #This line convert the image in a 200 x 150 thumb 
        filename=$(basename "$file")
        extension="${filename##*.}"
        filename="${filename%.*}"
        convert -sample 200x150 "$file" "${THUMBS_FOLDER}/${filename}_thumb.${extension}"   
     fi
  fi     
done

3voto

sgroh Points 344

Une autre approche sans utiliser imageinfo :

N'oubliez pas de changer le chemin des images, dans mon cas j'utilise un dossier appelé imgs au même niveau de dossier.

Copiez le contenu d'un fichier appelé create_thumbs.sh, et collez le code suivant :

#!/bin/bash
THUMBS_FOLDER=/home/image/thumb
for file in /home/image/*
do
  # next line checks the mime-type of the file
  IMAGE_TYPE=`file --mime-type -b "$file" | awk -F'/' '{print $1}'`
  if [ x$IMAGE_TYPE = "ximage" ]; then
      IMAGE_SIZE=`file -b $file | sed 's/ //g' | sed 's/,/ /g' | awk  '{print $2}'`
      WIDTH=`echo $IMAGE_SIZE | sed 's/x/ /g' | awk '{print $1}'`
      HEIGHT=`echo $IMAGE_SIZE | sed 's/x/ /g' | awk '{print $2}'`           
      # If the image width is greater that 200 or the height is greater that 150 a thumb is created
     if [ $WIDTH -ge  201 ] || [ $HEIGHT -ge 151 ]; then
        #This line convert the image in a 200 x 150 thumb 
        filename=$(basename "$file")
        extension="${filename##*.}"
        filename="${filename%.*}"
        convert -sample 200x150 "$file" "${THUMBS_FOLDER}/${filename}_thumb.${extension}"   
     fi
  fi     
done

Pour l'appeler :

bash create_thumbs.sh

0voto

Kurt Pfeifle Points 24491

Ce code peut être plus facile à comprendre :

#!/bin/bash
for file in /path/to/images/*
do
  # next line checks the mime-type of the file
  CHECKTYPE=`file --mime-type -b "$file" | awk -F'/' '{print $1}'`
  if [ "x$CHECKTYPE" == "ximage" ]; then
    CHECKSIZE=`stat -f "%z" "$file"`               # this returns the filesize
    CHECKWIDTH=`identify -format "%W" "$file"`     # this returns the image width

    # next 'if' is true if either filesize >= 200000 bytes  OR  if image width >=201
    if [ $CHECKSIZE -ge  200000 ] || [ $CHECKWIDTH -ge 201 ]; then
       convert -sample 200x150 "$file" "$(dirname "$file")/thumb_$(basename "$file")"
    fi
  fi
done

0voto

sgroh Points 344

Votre script avec une légère modification et l'installation d'imageinfo fonctionne comme prévu. Voir ci-dessous la solution :

Installer l'outil imageinfo (dans mon cas il a été installé, vérifiez si vous l'avez déjà)

sudo apt-get install imageinfo

Et le script :

#!/bin/bash
for file in ./image/*
do
  # next line checks the mime-type of the file
  IMAGE_TYPE=`file --mime-type -b "$file" | awk -F'/' '{print $1}'`
  if [ "x$IMAGE_TYPE" == "ximage" ]; then

    WIDTH=`imageinfo --width "$file"`      # obtaining the image width
    HEIGHT=`imageinfo --height "$file"`    # obtaining the image height

    # If the image width is greater that 200 or the height is greater that 150 a thumb is created
    if [ $WIDTH -ge  201 ] || [ $HEIGHT -ge 151 ]; then
       #This line convert the image in a 200 x 150 thumb 
       convert -sample 200x150 "$file" "$(dirname "$file")/thumb_$(basename "$file")" 
    fi
  fi
done

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X