Compression d'image : avec ou sans perte

Une photo de 12 megapixels devrait peser 36 Mo en theorie, mais votre JPEG ne fait que 3 Mo ! Comment est-ce possible ? Grace a la compression, une technique ingenieuse pour reduire la taille des fichiers.

Difficulte:
25 min
+30 XP

Formules cles a retenir

Taux de compression = Taille originale / Taille compressee
Taille brute = L x H x 3 octets (24 bits)

Exemple : Photo 12 MP compressee de 36 Mo vers 3 Mo = taux 12:1

Objectifs du cours

  • Comprendre la difference entre compression avec et sans perte
  • Savoir calculer le taux de compression d'une image
  • Connaitre les principaux algorithmes de compression (RLE, DCT)
  • Choisir le bon format selon l'usage (JPEG, PNG, WebP)

Erreurs courantes a eviter

  • Croire que compresser une image JPEG plusieurs fois n'affecte pas la qualite
  • Confondre taille du fichier et dimensions de l'image (les deux sont differents !)
  • Penser que PNG est toujours meilleur que JPEG (faux pour les photos)
  • Ignorer que la compression avec perte est irreversible

**Le probleme du stockage brut**

Une image non compressee occupe beaucoup d'espace :

**Calcul de la taille brute (format BMP)** : - Taille = Largeur x Hauteur x Profondeur de couleur - Photo 12 MP (4000 x 3000) en 24 bits : - 4000 x 3000 x 3 octets = **36 Mo** par photo !

**Consequences sans compression** : - 1 carte SD de 32 Go = seulement 888 photos - Envoyer une photo par email = plusieurs minutes - Site web = temps de chargement insupportables

**La solution : la compression**

Reduire la taille du fichier tout en conservant l'information essentielle.

**Deux grandes familles** : 1. **Compression sans perte** (lossless) : on peut retrouver l'image originale 2. **Compression avec perte** (lossy) : on sacrifie des details pour gagner plus de place

**Le taux de compression**

**Taux = Taille originale / Taille compressee**

Exemple : - Image originale : 36 Mo - Apres compression : 3 Mo - Taux = 36 / 3 = **12:1** (compression par 12)

Plus le taux est eleve, plus on gagne de place, mais on perd potentiellement en qualite.

Python - Compression d'images
# Calcul de taille d'image et taux de compression

def taille_image_brute(largeur, hauteur, bits_par_pixel=24):
    """Calcule la taille d'une image non compressee en octets."""
    pixels = largeur * hauteur
    octets_par_pixel = bits_par_pixel / 8
    taille_octets = pixels * octets_par_pixel
    return int(taille_octets)

def formater_taille(octets):
    """Formate une taille en Ko, Mo ou Go."""
    if octets < 1024:
        return f"{octets} octets"
    elif octets < 1024 * 1024:
        return f"{octets / 1024:.1f} Ko"
    elif octets < 1024 * 1024 * 1024:
        return f"{octets / (1024 * 1024):.1f} Mo"
    else:
        return f"{octets / (1024 * 1024 * 1024):.1f} Go"

def taux_compression(taille_originale, taille_compressee):
    """Calcule le taux de compression."""
    return taille_originale / taille_compressee

print("=== TAILLE D'IMAGES NON COMPRESSEES ===\n")

resolutions = [
    ("VGA", 640, 480),
    ("HD 720p", 1280, 720),
    ("Full HD 1080p", 1920, 1080),
    ("4K UHD", 3840, 2160),
    ("Photo 12 MP", 4000, 3000),
    ("Photo 48 MP", 8000, 6000),
]

print(f"{'Resolution':<20} {'Dimensions':<15} {'Taille brute':<15}")
print("-" * 50)

for nom, l, h in resolutions:
    taille = taille_image_brute(l, h)
    print(f"{nom:<20} {l}x{h:<10} {formater_taille(taille):<15}")

print("\n=== IMPACT DE LA COMPRESSION ===\n")

# Exemple avec une photo 12 MP
taille_brute = taille_image_brute(4000, 3000)
formats = [
    ("BMP (non compresse)", taille_brute),
    ("PNG (sans perte)", int(taille_brute * 0.6)),      # ~40% reduction
    ("JPEG qualite 100%", int(taille_brute * 0.15)),   # ~85% reduction
    ("JPEG qualite 80%", int(taille_brute * 0.08)),    # ~92% reduction
    ("JPEG qualite 50%", int(taille_brute * 0.04)),    # ~96% reduction
    ("WebP qualite 80%", int(taille_brute * 0.05)),    # ~95% reduction
]

print(f"Photo originale : 4000x3000 pixels (12 MP)\n")
print(f"{'Format':<25} {'Taille':<12} {'Taux':<10} {'Reduction':<10}")
print("-" * 60)

for nom, taille in formats:
    taux = taux_compression(taille_brute, taille)
    reduction = (1 - taille / taille_brute) * 100
    print(f"{nom:<25} {formater_taille(taille):<12} {taux:.1f}:1{'':<5} -{reduction:.0f}%")

print("\n=== EXERCICE : CALCULER UN TAUX ===\n")
print("Une image de 8 Mo est compressee en 500 Ko.")
print(f"Taux de compression = {taux_compression(8*1024*1024, 500*1024):.1f}:1")

Quiz de validation

1. Quelle est la difference principale entre compression avec et sans perte ?

2. Une image de 10 Mo est compressee en 500 Ko. Quel est le taux de compression ?

3. Quel algorithme est utilise dans la compression JPEG ?

4. Quel format est recommande pour un logo avec fond transparent ?

5. Que se passe-t-il si on sauvegarde une image JPEG plusieurs fois ?

Pixel