Aller au contenu

Administration Unix - TP séance 08

À la fin de la séance, déposez votre fichier de réponses sur la page Ametice en suivant bien les instructions, même si vous n'avez pas fini la planche ; lorsque vous aurez terminé, vous pourrez re-déposer la version finale.

Mini-projet (partie 1/3) : miniatures d'images

Dans ce mini-projet on va se servir de ImageMagick (voir dernière question du TP4 pour un installation éventuelle sur votre ordinateur).

Respectez bien les spécifications de l'énoncé, car les fonctions que l'on va écrire seront appelées dans la suite et devront avoir un comportement précis ; lors de chaque question, testez votre code sur plusieurs exemples.

a) La commande suivante de ImageMagick :

convert src -thumbnail "LxH>" dest

fabrique à partir de l'image source src, une miniature de taille maximum L*H (c'est-à-dire de largeur <= L et de hauteur <= H en conservant le facteur de forme) puis l'enregistre comme image destination dest.

Dans l'argument "LxH>", le x sert à séparer L et H, et le > signifie que si l'image src est plus petite que la taille L*H, elle ne doit pas être grossie.

On va télécharger des images pour fabriquer des miniatures avec convert.

Verifiez que la commande wget est installée en tapant : wget --version. Sinon, sur votre machine personnelle, vous pouvez installer la commande wget en tapant : sudo apt install wget

Téléchargez ces 3 images avec wget en tapant :

wget https://pageperso.lis-lab.fr/~edouard.thiel/ens/adunix/pub/fleur{1..3}.jpg

puis appelez la commande convert pour créer des miniatures de taille maximum 200 par 150 au format png.

Vérifiez les résultats avec les commandes :

  • file dest   affiche le type et la taille de l'image,
  • display dest   affiche l'image (voir remarque),

puis supprimez les miniatures.

Remarque : la commande display de ImageMagick ne marche que sous Linux ; si vous utilisez un autre système, vous pouvez voir ces images dans votre gestionnaire de fichiers.

b) Créez un script miniatures.sh contenant ces lignes :

# Configuration du script
MINIA_LARG=100
MINIA_HAUT=80

# Fonctions du script

# Programme principal

Rajoutez dans la partie # Programme principal les 2 lignes :

echo "$MINIA_LARGx$MINIA_HAUT>"
echo "${MINIA_LARG}x${MINIA_HAUT}>"

puis exécutez le script ; de ces deux lignes, quelle est la bonne syntaxe à utiliser pour fabriquer une chaîne sous la forme "100x80>" ? Pourquoi l'autre ne marche pas ?

c) Rajoutez dans la partie # Fonctions du script une fonction generer_miniature qui prend en premier argument une image source avec son chemin, et en second argument, une image destination avec son chemin.

La fonction affiche un message sous la forme :

miniature: 'src' -> 'dest'

en remplaçant src et dest par les noms des images (avec leur chemin).

La fonction génère ensuite une miniature de l'image source, de taille maximale MINIA_LARG * MINIA_HAUT, et l'enregistre comme image destination, en appelant la commande vue précédemment.

Testez la fonction à la fin du script avec les images téléchargées, puis supprimez les miniatures.

d) Rajoutez (toujours dans le script) une fonction est_image, qui reçoit en argument un fichier avec son chemin éventuel. La fonction réussit si le fichier est régulier et s'il s'agit d'une image.

Pour déterminer si un fichier est une image, il suffit d'appeler la commande file puis de vérifier si pour la partie de la ligne affichée après le premier : jusqu'à la fin, grep réussit sur le mot clé "image".

e) Rajoutez une fonction donner_nom_miniature, qui reçoit en argument un nom d'image avec son chemin. La fonction affiche la chaîne obtenue en enlevant le chemin et la dernière extension, puis en rajoutant "mini_" devant et ".png" derrière.

f) Rajoutez une fonction generer_miniatures_rep qui prend en premier argument un répertoire d'images sources rep_src, et en second argument un répertoire d'images destinations rep_dest.

La fonction commence par créer si besoin le répertoire rep_dest grâce à la commande mkdir -p, puis se termine si la commande a échoué.

La fonction examine ensuite chaque fichier du répertoire rep_src, en réalisant ces opérations dans l'ordre :

  • si le fichier n'est pas une image alors on l'ignore (cf remarque 1) ;
  • on appelle la fonction generer_miniature de manière à créer une miniature du fichier courant, et la stocker dans le répertoire rep_dest, sous le nom obtenu avec la fonction donner_nom_miniature.

Remarque 1 : dans une boucle sur des fichiers, pour ignorer le fichier courant il suffit de passer au fichier suivant en appelant continue.

Remarque 2 : pour boucler sur les fichiers d'un répertoire, n'utilisez ni ls ni find, mais for sur un motif avec *.

Testez à la fin du script cette fonction avec comme répertoire source le répertoire courant ".", et comme répertoire destination le répertoire "./thumbnails" ; vérifiez que dans ./thumbnails ont bien été créées les images mini_fleur{1..3}.png.