105 votes

Comment réduire la taille du fichier image à l'aide de l'IAP

J'utilise PIL pour redimensionner les images en convertissant les grandes images en petites. Existe-t-il des méthodes standard pour réduire la taille du fichier de l'image sans trop perdre en qualité ? Disons que la taille originale de l'image est de 100 Ko, je veux la réduire à 5 ou 10 Ko, surtout pour les formats png et jpeg.

170voto

Ryan G Points 6988

Un paramètre intégré pour l'enregistrement des JPEG et des PNG est le suivant optimize .

 >>> from PIL import Image
 # My image is a 200x374 jpeg that is 102kb large
 >>> foo = Image.open("path\\to\\image.jpg")
 >>> foo.size
  (200,374)
 # I downsize the image with an ANTIALIAS filter (gives the highest quality)
 >>> foo = foo.resize((160,300),Image.ANTIALIAS)
 >>> foo.save("path\\to\\save\\image_scaled.jpg",quality=95)
 # The saved downsized image size is 24.8kb
 >>> foo.save("path\\to\\save\\image_scaled_opt.jpg",optimize=True,quality=95)
 # The saved downsized image size is 22.9kb

En optimize flag effectuera un passage supplémentaire sur l'image pour trouver un moyen de réduire sa taille autant que possible. 1.9kb peut sembler peu, mais sur des centaines/milliers d'images, cela peut s'accumuler.

Pour essayer de le réduire à 5 ou 10 kb, vous pouvez modifier la valeur de la qualité dans les options de sauvegarde. En utilisant une qualité de 85 au lieu de 95 dans ce cas, on obtiendrait : Non optimisé : 15.1kb Optimisé : 14.3kb L'utilisation d'une qualité de 75 (valeur par défaut si l'argument est omis) donnerait les résultats suivants : Non optimisé : 11.8kb Optimisé : 11.2kb

Je préfère la qualité 85 avec l'optimisation car la qualité n'est pas trop affectée et la taille du fichier est beaucoup plus petite.

25voto

nash Points 263

Disons que vous avez un modèle appelé Book et sur celui-ci un champ appelé 'cover_pic', dans ce cas, vous pouvez faire ce qui suit pour compresser l'image :

from PIL import Image
b = Book.objects.get(title='Into the wild')
image = Image.open(b.cover_pic.path)
image.save(b.image.path,quality=20,optimize=True)

J'espère que cela aidera ceux qui tomberont dessus.

4voto

Cryptite Points 335

Voir le vignette fonction du module image de l'IAP. Vous pouvez l'utiliser pour enregistrer des versions plus petites de fichiers sous différents types de fichiers et, si vous souhaitez préserver autant que possible la qualité, envisagez d'utiliser la fonction de sauvegarde de l'image. ANTIALIAS filtre quand vous le faites.

En dehors de cela, je ne suis pas sûr qu'il y ait un moyen de spécifier une taille maximale souhaitée. Vous pourriez, bien sûr, écrire une fonction qui essaierait d'enregistrer plusieurs versions du fichier à des qualités différentes jusqu'à ce qu'une certaine taille soit atteinte, en rejetant le reste et en vous donnant l'image que vous voulez.

4voto

Song Points 140

Le gestionnaire d'images principal dans PIL es PIL 's Image module.

from PIL import Image
import math

foo = Image.open("path\\to\\image.jpg")
x, y = foo.size
x2, y2 = math.floor(x-50), math.floor(y-20)
foo = foo.resize((x2,y2),Image.ANTIALIAS)
foo.save("path\\to\\save\\image_scaled.jpg",quality=95)

Vous pouvez ajouter optimize=True dans les arguments si vous voulez réduire la taille encore plus, mais l'optimisation ne fonctionne que pour les JPEG et les PNG. Pour les autres extensions d'image, vous pouvez diminuer la qualité de la nouvelle image enregistrée. Vous pouvez modifier la taille de la nouvelle image en supprimant un bout de code et en définissant la taille de l'image, ce qui ne peut être fait que si vous regardez attentivement le code. J'ai défini cette taille :

x, y = foo.size
x2, y2 = math.floor(x-50), math.floor(y-20)

juste pour vous montrer ce qui se fait (presque) normalement avec des images horizontales. Pour les images verticales, vous pourriez faire :

x, y = foo.size
x2, y2 = math.floor(x-20), math.floor(y-50)

. N'oubliez pas que vous pouvez toujours supprimer ce bout de code et définir une nouvelle taille.

0voto

Ruhul Amin Points 158

Vous pouvez redimensionner votre image ou en réduire la qualité. Quelques exemples ci-joints :

Python PIL redimensionner l'image

from PIL import Image
WIDTH = 1020
HEIGHT = 720
img = Image.open("my_image.jpg")
resized_img = img.resize((WIDTH, HEIGHT))
resized_img.save("resized_image.jpg")

Changer l'oreiller de résolution de l'image

from PIL import Image
size = 7016, 4961
im = Image.open("my_image.png")
im_resized = im.resize(size, Image.ANTIALIAS)
im_resized.save("image_resized.png", "PNG")

OU vous pouvez utiliser

im_resized.save("image_resized.png", quality=95, optimize=True)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X