Aller au contenu

← Blog · Outils · 2026-09-29

Outil de compression

Un petit outil pour réduire le poids d'un dossier de photos avant de les envoyer, les publier ou les archiver

Sommaire

Cet outil réduit le poids d'un ensemble de photos (un dossier entier) en les recompressant en JPEG ou en WebP, avec en option une réduction de leur taille. Les photos compressées sont écrites dans un dossier à part, les originaux ne sont jamais touchés.

Il est utile pour envoyer des photos par courriel, les publier sur un site ou libérer de la place sur un disque, avec un aperçu du résultat et du poids gagné avant de lancer le traitement sur toute la série.

Il a été développé et testé uniquement sur Mac. Il devrait aussi fonctionner sous Windows mais n'y a pas été testé (voir Sous Windows pour les différences).

Télécharger

  • squeeze.pyv1.0.0 · SHA-256 012990e9816bd2e5… Le script : un seul fichier Python.

Sans garantie

Cet outil réalisé avec Claude est fourni sans aucune garantie. Vous l'utilisez sous votre seule responsabilité. Le script ne modifie jamais les photos d'origine et refuse d'exporter dans leur dossier, mais gardez toujours une sauvegarde de vos photos : une compression JPEG ou WebP fait perdre de l'information de façon définitive.

Installation

Il faut Python 3.9 ou plus récent. Le plus simple : l'installeur de python.org.

À faire une seule fois, dans le Terminal, depuis le dossier où se trouve squeeze.py (ici Téléchargements) :

cd ~/Downloads
python3 -m venv squeeze-env
squeeze-env/bin/python3 -m pip install PySide6 Pillow

L'environnement virtuel est ainsi créé et les bibliothèques installées.

Ensuite, pour lancer l'outil, il suffit d'utiliser le Python de l'environnement virtuel sur votre dossier de photos (ou sans argument si vous souhaitez indiquer le dossier plus tard) :

squeeze-env/bin/python3 squeeze.py ~/Photos/voyage

L'outil lit les photos en JPEG, PNG, TIFF et WebP mais pas les fichiers RAW.

Sous Windows

L'outil n'a été développé et testé que sur Mac, mais il repose sur des bibliothèques qui existent aussi sous Windows (Qt et Pillow) et devrait donc y fonctionner sans adaptation.

Il faut installer Python si vous ne l'avez pas déjà depuis python.org. Les commandes sont les mêmes que sur Mac, dans l'invite de commandes, avec py à la place de python3 et Scripts\python à la place de bin/python3. À faire une seule fois (dans le dossier où vous avez mis l'outil) :

py -m venv squeeze-env
squeeze-env\Scripts\python -m pip install PySide6 Pillow

Puis, pour lancer l'outil :

squeeze-env\Scripts\python squeeze.py "C:\Photos\voyage"

Le raccourci Ctrl remplace ⌘ (voir le tableau des raccourcis).

Utilisation

1. Ouvrir un dossier

Ouvrez le dossier de photos avec « Ouvrir un dossier… » (ou en l'indiquant au lancement). La liste à gauche montre chaque photo avec son poids, et le total du dossier s'affiche en bas à droite.

2. Régler la compression

  • Le format : JPEG, lu partout, ou WebP, généralement 25 à 35 % plus léger à qualité égale mais un peu moins universel.
  • La qualité, de 10 à 100. Autour de 80, la différence est très difficile à voir à l'écran pour un poids souvent divisé par trois ou quatre ; en dessous de 60, les aplats et les dégradés (le ciel par exemple) commencent à montrer des paliers.
  • Le côté long maximum (4096, 3000, 2048, 1600, 1200 ou 800 px) : les photos plus grandes sont réduites, les plus petites ne sont jamais agrandies. Réduire la taille est le levier le plus efficace : passer de 6000 à 2048 px divise le nombre de pixels par près de 9.
  • Conserver les métadonnées : recopie les données EXIF (boîtier, date, réglages, GPS) et le profil couleur. Décochez pour publier des photos sans localisation ni informations sur le matériel, et gagner quelques Ko.
  • Garder l'original s'il est déjà plus léger : une photo déjà très compressée peut grossir à la recompression. Elle est alors simplement copiée (si vous n'avez pas demandé de réduction de taille).

3. Vérifier l'aperçu

Quand vous cliquez sur une photo de la liste ou que vous changez un réglage, l'outil compresse cette photo en mémoire et l'affiche telle qu'elle sera exportée, avec sa taille en pixels, son poids avant et après et le gain (par exemple 2048 × 1366 px — 2,2 Mo → 71,2 Ko (−97 %)). Comparez le résultat avec l'original sur une photo détaillée (feuillage, plumes) : c'est là que les défauts apparaissent en premier.

4. Compresser

Choisissez le dossier de sortie (par défaut <dossier>_compresse, à côté du dossier d'origine) puis cliquez sur « Compresser ». Les photos gardent leur nom, avec l'extension du format choisi. Une barre de progression s'affiche et le traitement peut être annulé. À la fin, l'outil indique le poids total avant et après (par exemple 12,9 Mo → 428 Ko (−97 %)).

Une photo illisible n'arrête pas le traitement : elle est signalée à la fin et les autres sont compressées normalement.

Sauvegarde

Les réglages et le dossier de sortie sont enregistrés automatiquement dans un fichier squeeze_reglages.json placé à côté des photos. En rouvrant le dossier, vous retrouvez vos réglages.

Raccourcis

Action Mac Windows
Ouvrir un dossier ⌘O Ctrl+O
Compresser ⌘E Ctrl+E

Sous le capot

La compression d'une photo

with Image.open(path) as src:
    exif = src.getexif()
    icc = src.info.get("icc_profile") if opts["metadata"] else None
    img = ImageOps.exif_transpose(src)          # applique la rotation puis la retire de l'EXIF
    img.load()
...
side = opts["max_side"]
if side and max(img.size) > side:               # jamais d'agrandissement
    img.thumbnail((side, side), Image.LANCZOS)

La rotation demandée par le boîtier (photos prises à la verticale) est appliquée aux pixels avant de tout enregistrer, puis remise à « normal » dans l'EXIF : sans cela, la photo apparaîtrait couchée après avoir été réduite. thumbnail conserve les proportions et ne fait que réduire.

kwargs = {"quality": int(opts["quality"])}
if opts["format"] == "jpg":
    kwargs.update(optimize=True, progressive=True)
else:
    kwargs.update(method=6)

En JPEG, optimize recalcule des tables de codage plus efficaces et progressive enregistre l'image en plusieurs passes : les deux réduisent un peu le poids sans coût en qualité. En WebP, method=6 prend plus de temps pour trouver la meilleure compression.

Le traitement en parallèle

with ThreadPoolExecutor(max_workers=max(1, (os.cpu_count() or 2) - 1)) as pool:
    futures = [(f, pool.submit(export_one, f, self.out_dir, self.opts)) for f in self.files]
    for f, fut in futures:
        try:
            b, a = fut.result()
            before, after = before + b, after + a
        except Exception as e:              # une photo illisible n'arrête pas le lot
            errors.append(f"{Path(f).name} : {e}")

Les photos sont compressées en parallèle, en laissant un cœur libre pour que la fenêtre reste fluide. Pillow libère le verrou de Python pendant le décodage et l'encodage, ce qui permet aux threads de réellement travailler en même temps.

À lire aussi