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épertoirerep_dest
, sous le nom obtenu avec la fonctiondonner_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
.