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.
Formules cles a retenir
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.
# 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 ?
