« Une image vaut mille mots », Vous connaissez probablement cette expression, non?

Certes, nous sommes tellement convaincu de sa signification, mais une image lourde c’est une image qui prend beaucoup de places en mémoire, et ça a pour conséquences un ralentissement dans les traitements, dans le chargement de site/blog et bien d’autres … Quel gâchis ! réduisons sa taille sans plus tarder 😉

Table of Contents

Introduction

Réduire la taille de l’image avec python est parmi les opérations de bases de toutes les librairies de traitement d’images, tel que : opencv-python, sickit-image, pillow et bien d’autres.

Dans cet article, nous voulons toujours continuer notre lancée avec Pillow, pour vous montrer comment procéder pour compresser une image, avec le langage python via sa librairie Pillow.

Nous voyons la réduction de la taille de l’image de deux manières:

  1. Passer un format connu pour son pouvoir de compression et par conséquent conserver les dimensions initiales de l’image
  2. Ou réduire les dimensions de l’image: diviser l’image en 2, en 3 …

Utiliser un format de compression

Le JPEG est un format d’images, qui par définition cible la compression d’images. Réduire la taille en sauvegardant l’image sous forme JPEG peut se relever efficace. Il faudra appeler la fonction save et spécifier le format JPEG, le code python sera alors:

#importer le package Image de la bibliothèque Pillow
from PIL import Image

#lire l'image
imageLue = Image.open("reduction/image2.bmp")

#sauvegarder l'image au format JPEG
imageLue.save("reduction/image_red.jpg")
Code python pour la compression JPEG

Exécution du code

Nous avons choisit l’image de cytologie microscopique ci dessous (disponible à https://www.kaggle.com/fanouna/microscopic-bone-marrow-images). C’est une image bitmap de taille 2305 ko.

image de cytologie

Après l’exécution du code, nous obtenons une nouvelle image JPEG de 37 ko de taille. C’est 62 fois plus inférieur à la taille de l’image originale et la qualité à vue d’œil est restée la même.

tailles d'images

JPEG et alpha

Sur certains formats d’images, nous trouvons la composante alpha (la transparence). Cette dernière ne peut être transformé directement par le format JPEG et il faut absolument convertir au système classique RGB, avant de sauvegarder au format JPEG.

Le code suivant est la mis à jour du précèdent, en s’assurant une conversion au format RGB avant la sauvegarde au JPEG.

#importer le package Image de la bibliothèque Pillow
from PIL import Image

#lire l'image
imageLue = Image.open("reduction/image2.bmp")

#convertir au format RGB
imageRGB = imageLue.convert("RGB")

#sauvegarder l'image au format JPEG
imageRGB.save("reduction/image_red.jpg")
Code python pour la compression JPEG avec la composante alpha

Réduire les dimensions de l’image

Vous vous êtes peut être posé la question, et si le format de l’image à compresser est déjà au format JPEG?

Si c’est le cas alors nous vous annonçons une terrible nouvelle 😀 au lieu d’obtenir une image de taille réduite, vous allez obtenir deux images de même tailles ! et voila le gâchis en espace mémoire 😉

Sérieusement, le passage au format JPEG n’aura plus aucun sens et la réduction de la dimension reste le seule moyen.

La fonction resize du module Image de la librairie Pillow, va nous permettre de réduire la dimension de l’image.

Notez toutes fois que resize ne sert pas qu’à réduire la dimension. Comme son nom l’indique c’est «redimensionner » et donc c’est dans les deux sens : réduire ou augmenter selon la dimension choisit par rapport à la dimension d’origine.

La fonction resize attend comme argument un tuple contenant la taille souhaitée (largeur x hauteur). Ici nous voulons diviser la taille de l’image en 2, donc, nous allons commencer par récupérer la dimension d’origine et la diviser en 2 dans la dimension compressée, et cela nous donne le code suivant:

#importer le package Image de la bibliothèque Pillow
from PIL import Image

#lire l'image
imageLue = Image.open("reduction/image2.bmp")

#taille de l'image
dim=imageLue.size

#redimensionner
imageComp=imageLue.resize((int(dim[0]/2.),int(dim[1]/2.)))

#sauvegarder l'image réduite
imageComp.save("reduction/image_comp.bmp")

#récupérer la dimension de l'image compressée
dimComp=imageComp.size

#Affichage des dimensions
print("Dimension d'origine: ",dim,"\nDimension compressée:",dimComp)
Code python pour réduire les dimensions de l’image

Remarques : La division est ici en float pour vous permettre d’essayer d’autres division. Après il est nécessaire de récupérer la partie entière car une image de dimension en virgule, ça n’existe pas

Exécution du code

L’exécution du code python ci-dessus, nous affiche les dimensions suivantes :

affichage

Sans surprise, la dimension de l’image réduite est bien la division de la dimension de l’originale en 2: 1024/2=512 et 768/2=384. Maintenant en terme de poids de l’image, l’originale est de 2305 Ko et la nouvelle obtenue est de 577Ko, un gain de plus de 4 fois. Cependant, en regardant les tailles en JPEG et en BMP, nous constatons que sans réduire les dimensions JPEG nous a permis de réduire 62 fois la taille.

taille nouvelle
Taille en Ko des images

Comme c’est une image BMP et par simple curiosité, nous allons sauvegarder l’image réduite en JPEG pour voir de de 577Ko, nous allons réduire à combien?

Nous vous laissons faire les modifications nécessaires, vous en êtes bien capables 😉

Avec une immense joie, nous vous annonçant que nous sommes passés à 14 Ko, nous dirons waaaw 😀

Affichage des tailles

Conclusion

Dans cet article, nous avons vu comment compresser une image c’est à dire réduire sa taille en Ko, soit en passant au format JPEG soit en réduisant les dimensions. arrivé là, nous vous conseillons, de modifier le code autant pour :

  • Choisir une dimension fixe (les tuples à spécifier et non à calculer)
  • Voir d’autres formats de compressions
  • Et pour s’amuser un peu, augmenter la taille de l’image en redimensionnant au supérieur : multiplier les dimensions au lieu de les diviser 😉

N’oubliez pas: A vos claviers, prêts? Pratiquez 🙂

Categories:

Tags:

No responses yet

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Recevez nos nouveautés