La carte du renseignement militaire russe avance bien. Cependant, certaines photos ajoutées aux marqueurs sont trop volumineuses. Conséquemment, certaines prennent du temps à télécharger et occupent inutilement de la bande passante. Il nous faut donc les redimensionner. Comme le texte de nos info-bulles est lui-même large de 300px, il faudrait que chaque photo ne fasse pas plus de 300 px de large et que la hauteur soit ajustée en conséquence, de façon à conserver le ratio de la photo et que celle-ci ne soit pas déformée. On pourrait le faire manuellement pour chacune avec, par exemple, GIMP. Il s’agirait alors d’ouvrir l’image dans ce logiciel, choisir sous Image/Échelle et taille de l’image, puis entrer 300 px dans la largeur.

Enfin, dans Fichier/Écraser l’image.

L’opération prend au minimum trente secondes. Or, l’on a déjà 88 photos à convertir, ce qui fait 44 minutes. D’autres photos vont s’ajouter jusqu’à la fin de la session. Dans le cas où nous aurions 2000 photos, ce serait 16h de travail, soit deux journées complètes à faire strictement la même chose, soit ouvrir des photos, les redimensionner et enregistrer, puis on recommence. Je ne sais pas pour vous, mais personnellement je trouve la vie courte et j’aimerais bien occuper mon temps autrement. Aussi, dans ce tutoriel nous allons voir comment automatiser cette tâche ennuyeuse avec Python.
Invite de commande
Il faut pour pouvoir suivre ce tutoriel avoir installé le module Pillow (à moins d’utiliser l’environnement Anaconda, mais c’est une autre histoire). Certains modules peuvent être installés directement dans la console Python en entrant, par exemple, la commande suivante:
import random
Ce sont les modules de base, qui viennent avec Python au moment de l’installation. D’autres modules doivent être installés à part, en se servant d’un programme pour les installer, soit pip-install. On peut le télécharger ici. Pour «installer cet installateur», il faut des connaissances de l’invite de commande. Ce qui suit est pour Windows, mais on peut trouver en ligne les infos sur comment faire en Mac ou Linux. Pour ouvrir l’invite de commande, le plus simple est de taper en même temps Windows+R à partir du bureau. On voit apparaître alors cette fenêtre.

Si on clique OK, on est maintenant dans l’invite de commande.

Ça fait très Matrix, je sais. Mais avec l’invite de commande, on peut changer le répertoire à partir duquel celle-ci fonctionne. Par exemple, pour travailler à partir du dossier où l’on aurait enregistré le script nous permettant d’installer pip. On peut facilement dans le bureau copier le chemin d’accès du dossier où se trouve le script et ensuite le coller dans l’invite de commande après la commande cd (change directory).

On peut ensuite simplement entrer la commande python suivante:
get-pip.py
On peut ensuite vérifier quelle version a été installée avec cette commande:
pip -V
Le résulat donne ceci:

On peut faire beaucoup plus de choses avec l’invite de commande, comme changer de disque dur. Pour cela, il suffit d’entrer dans l’invite la lettre correspondant au disque, suivie de deux points:

On peut aussi voir le contenu d’un dossier en naviguant dans le dossier (comme on vient de le voir) puis en entrant la commande dir (la casse n’a pas d’importance dans l’invite de commande).
On pourrait créer dans le répertoire où l’on est présentement, ici Projets, un nouveau dossier intitulé Antoine:
D:\Dropbox\Coding\Projets>mkdir Antoine
Si on entre à nouveau la commande dir, on voit que le dossier existe maintenant.

On pourrait aussi créer un nouveau dossier en dehors du répertoire. Il faut alors entrer le chemin absolu.
D:\Dropbox\Coding\Projets>mkdir c:\Joshua
On peut créer des sous-dossiers:
D:\Dropbox\Coding\Projets>mkdir c:\Antoine\Courge
On peut faire beaucoup d’autres choses avec l’invite de commande. Pour les connaître, simplement entrer help. Mais pour l’instant, cela devrait nous avoir suffi à installer pip-install. Nous allons maintenant pouvoir installer le module Pillow. Toujours dans l’invite de commande, entrer:
pip install --user pillow==6.0.0
Nous allons mainteant pouvoir écrire un programme pour redimensionner toutes nos photos. On quitte donc l’invite de commande et on ouvre notre console Python.
Pillow
Notre programme consiste en une boucle qui va redimensionner toutes les photos dans notre dossier. Quand on écrit un tel programme, on peut chercher par mots-clés dans Internet, idéalement en anglais. On va généralement se retrouver dans des sites comme StackOverflow où les programmeurs échangent des idées. Souvent, on y trouvera plus d’une solution au problème qu’on veut résoudre. Par exemple, pour redimensionner les photos, on trouvera une recette qui demande deux pages de programmation. Ça fonctionne. Mais plus loin dans le fil de la conversation, une autre recette fonctionne aussi bien qui tient en cinq lignes de programmation. La beauté de l’informatique est qu’il y a toujours plus d’une façon d’arriver au même résultat. Souvent, j’ai remarqué que les programmes les plus courts font usage d’un autre module, glob, qui fait partie de la bibliothèque de base. Aussi, on va l’installer tout de suite:
import glob
Si l’on cherchait en ligne une recette pour apprêter les oursins, et que celle-ci impliquait de réaliser une béchamel, mais que son auteur prenait pour acquis que l’on sait déjà comment en faire une, on ne serait guère avancé. C’est la même chose en programmation: si l’on trouve une recette, encore faut-il pouvoir la comprendre. Dans le cours Informatique appliquée à l’histoire que je donne pour une deuxième fois cette année, c’est le concept de boucle en programmation qui semble le plus difficile à comprendre pour beaucoup de mes étudiant.e.s. Or, celui-ci est indispensable pour comprendre la recette qui va nous permettre de modifier nos photos.
Il faut en fait voir les boucles comme un compteur qui dit au programme de faire une telle chose un nombre x de fois. Par exemple, nous avons une boucle du type suivant, soit littéralement «sachant que i a une valeur initiale de 0, tant que i est plus petit que trois, imprime i et ensuite ajoute 1 à i»:
i = 0 while i < 3: print(i) i+=1
Donc, Python va exécuter l’opération demandée de lui (soit ajouter 1 à i) tant que i sera inférieur à 3 et terminera l’opération quand i sera égal à 3.

Le résultat dans la console est:
0 1 2
Nous avions vu précédemment que i+=1 est une façon d’écrire «ajoute 1 à i». Nous avons également vu qu’il y a des boucles du type while, comme ici, et d’autres du type for in. La première vérifie un énoncé (tant qu’il est vrai que i<3), la suivante s’applique plutôt à une liste d’éléments. C’est la seconde que nous allons utiliser dans cet article. Après ce petit rappel sur les boucles, voyons le programme pour nos photos.
#À cause de la façon que pillow est écrit, il faut importer ainsi: from PIL import Image #On importe ensuite des modules standards qui vont nous permettre de faire des opérations avec le système de notre ordinateur import os, sys #Puis on importe le fameux module qui permet notamment de trouver des fichiers selon leur extension import glob #on positionne le programme dans le répertoire qui contient nos images root_dir = ""D:\\Dropbox\\Coding\\Projets\\Razvedka\\renseignement\\renseignement\\militaire\\images" #on remarquera les doubles barres obliques inverses #Il est temps maintenant d'écrire la boucle: for filename in glob.iglob(root_dir + '**/*.jpg', recursive=True): print(filename) basewidth = 300 im = Image.open(filename) wpercent = (basewidth/float(im.size[0])) hsize = int((float(im.size[1])*float(wpercent))) imResize = im.resize((basewidth,hsize), Image.ANTIALIAS) imResize.save(filename, 'JPEG', quality=90)
Il est pas nécessaire de comprendre chaque ligne, mais on peut préciser que Filename est auto-instancié puisqu’il suit le début de la définition d’une boucle du type For… in, de la même façon que nous n’avions pas à définir i dans la boucle précédente. Notons aussi que recursive=True veut dire que le programme s’applique à n’importe quel fichier et à tous les dossiers et sous-dossiers contenus dans la racine (root). La largeur est définie à 300 (px). Pour ce qui est de wpercent et sa définition, c’est une façon de s’assurer que le ratio est respecté et que l’image ne sera pas déformée. Enfin, l’image est redimensionnée, en conservant le nom originel, en ajoutant l’extension JPEG et en lui attribuant une qualité (90) qui est satisfaisante pour le Web. À noter que nos fichiers seront écrasés, donc ce n’est pas mauvais de faire une copie de sauvegarde des originaux avant de procéder.
ZipFile
Pendant qu’on y est, on peut regarder un autre court programme qui nous permet d’extraire en lot des fichiers compressés:
# importer les modules from zipfile import ZipFile from glob import glob #extraire tous les fichiers dans le dossier qui ont une extension 'zip' for z in glob('*.zip'): ZipFile(z).extractall()
Il faut avoir d’abord installé le module ZipFile dans l’invite de commande (comme expliqué plus haut). Comme on ne spécifie pas le répertoire racine (root_dir), le programme doit être enregistré dans le même dossier qui contient nos zips. On pourrait aussi l’ajouter (comme dans le programme précédent) ainsi: root_dir = « D:\exemple\exemple…
PyPDF
Un petit dernier pour la route? Le programme suivant a été écrit par Joshua pour combiner les PDFs qui forment le collectif Cuisiner l’héritage en un seul PDF que nous allons pouvoir envoyer bientôt à l’éditeur. Il nécessite un autre module, qu’on doit avoir pip-installé.
import PyPDF4 e1 = [] e2 = [] x = 0 livre = ['1.couvertureLivre.pdf','2.table.pdf','3.Intro.pdf','4. Sphoungata.pdf','5.Brouet de canelle.pdf','6.boereksdocx.pdf', '7.fricassee.pdf', '8.Kougelhopf_V2.pdf', '9.pelmenis2.pdf', '10.pate chinois.pdf', '11.banane.pdf', '12.bolognese.pdf'] while x < len(livre): e1.append(open(livre[x], 'rb')) x = x + 1 x = 0 while x < len(livre): e2.append(PyPDF4.PdfFileReader(e1[x])) x = x + 1 pdfWriter = PyPDF4.PdfFileWriter() x= 0 while x < len(e2): for pageNum in range(e2[x].numPages): pageObj = e2[x].getPage(pageNum) pdfWriter.addPage(pageObj) x = x + 1 pdfOutputFile = open('combine.pdf', 'wb') pdfWriter.write(pdfOutputFile) pdfOutputFile.close() for fermer in e1: fermer.close()
Pour faire la même chose en Windows, il faudrait acheter un abonnement Adobe Acrobat PDF Pack qui coûte 13$ par mois! En Mac, on pourrait utiliser Aperçu, qui vient avec l’ordi et qui permet de combiner des PDF en les «drag and drop-ant» sur le côté. Il y a aussi Automator qui permet d’automatiser cette tâche. Automator est très bien en soi pour automatiser des tâches sans savoir programmer, mais est très limité. J’étais en Mac avant et Automator est la raison pour laquelle j’ai voulu apprendre à programmer: pouvoir faire beaucoup plus de choses! En résumé, comme Joshua l’a dit dans le cours (où il est mon assistant): «Le programmeur est paresseux, mais chez lui, c’est une vertu.» J’en ai fait mon credo.

3 commentaires
3 Pingbacks