Découpe d'image pour impression poster

Découpeur d’image pour impression poster #

Nous allons réaliser avec tkinter l’interface graphique pour un utilitaire (que nous créerons aussi) qui permet de découper et redimensionner une image en vue d’une impression poster (sur plusieurs A4).

L’idée est de donner un fichier image (sélectionné dans l’interface), puis une taille d’impression, par exemple A2. Partant de là, le programme découpera l’image en 4 images, qui seront enregistrées sur le disque. L’utilisateur pourra alors (hors de l’interface) imprimer les 4 images sur des A4 pour obtenir un format A2.

Objectif #

L’interface finale devra ressembler à ceci :

L’utilisateur clique sur le bouton du haut pour choisir une image (avec un sélecteur de fichiers), choisit le format dans la liste déroulante (ici A3), puis en cliquant sur le bouton “Générer les fichiers”, des images sont créées sur le disque.

Voici un exemple de ce qui est obtenu sur une image préparée.

Image de départ (notez que cette image a déjà le bon ratio 1/sqrt(2))

Si on sélectionne A3 dans la liste déroulante, le programme créee ces 2 images :

et

Si on sélectionne A2, on obtiendra ces 4 images :

Module utilisés #

Vérifiez que vous avez le module Pillow installé. Il faudra le faire si ce n’est pas le cas. Pour vérifier l’installation, essayez d’importer les modules :

import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk

Documentation, conseils et pistes #

Le différents widgets utilisés sont : Button, Canvas (pour l’affichage de l’image), OptionMenu (liste déroulante) et filedialog.askopenfilename (boîte de dialogue d’ouverture de fichier)

Le module PIL (en réalité Pillow) est utilisé pour charger l’image, créer la vignette en petit pour l’affichage, découper l’image, la tourner et enregistrer le résultat.

Voici des liens vers diverse documentations :

Votre programme doit non seulement fonctionner, mais aussi être bien fait. Nous ne faisons pas de POO, et vous serez donc amenés à utiliser quelques variables globales. **Regroupez les dans un dictionnaire** :
widgets = {'image': None, 'canvas': None}...

En ce qui concerne le découpage de l’image en A3, A2 A1 ou A0, ne faites pas 4 procédures ! Remarquez plutôt que découper un A0 en deux donne 2 A1, découper un A1 en deux donne 2 A2, etc…

Comprenez bien que vous aurez 2 images : l’originale, sur laquelle travailler, et la vignette, affichée dans le canvas. Il faut créer l’image pour l’affichage dans le canvas avec ImageTk.PhotoImage (faite une recherche à ce sujet, et notez le problème de la référence globale à conserver).

Pour mettre à jour le canvas, il faut d’abord effacer l’image qui s’y trouve avant d’en recréer une autre. La méthode Canvas.find_all() permet d’itérer sur les identifiants des objets dessinés dans un canvas et Canvas.delete(id) permet d’effacer un objet en donnant son identifiant.

Lorsqu’on utilise un objet OptionMenu, on peut écrire une callback qui sera appelée lorsqu’on déselectionne un item dans la liste. On peut aussi associer une variable au Widget, qui vaudra systématiquement la valeur sélectionnée dans le widget (voyez les exemples dans les documentations ci-dessus).

Dans un premier temps, faites fonctionner votre programme sur des images qui sont déjà au bon format et ratio.

Améliorations #

  • Essayer de nommer au mieux les fichiers de sortie
  • Visualiser la découpe sur la vignette dans l’interface graphique (en traçant des lignes dans le Canvas)
  • Permettre l’utilisation d’images aux formats et proportions variées
  • Assembler les images résultantes dans un pdf