web-dev-qa-db-fra.com

Comment réduire la taille du fichier image en utilisant PIL

J'utilise PIL pour redimensionner les images en convertissant des images plus grandes en images plus petites. Existe-t-il des méthodes standard pour réduire la taille de fichier de l'image sans perdre trop de qualité? Supposons que la taille d'origine de l'image est de 100 Ko. Je souhaite la réduire à 5 ou 10 Ko, en particulier pour les formats png et jpeg.

49
Yashwanth Kumar

Un paramètre intégré pour la sauvegarde des fichiers JPEG et PNG est 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

Le drapeau optimize fera un passage supplémentaire sur l’image pour trouver un moyen de réduire sa taille autant que possible. 1,9 Ko pourrait ne pas sembler beaucoup, mais sur des centaines/milliers d’images, cela peut s’ajouter.

Maintenant, pour essayer de le réduire à 5 Ko à 10 Ko, vous pouvez modifier la valeur de qualité dans les options de sauvegarde. Dans ce cas, utiliser une qualité de 85 au lieu de 95 donnerait: Non optimisé: 15,1 Ko Optimisé: 14,3 Ko Utiliser une qualité de 75 (valeur par défaut si l'argument est laissé) produirait: Non optimisé: 11,8 Ko Optimisé: 11,2 Ko

Je préfère la qualité 85 à optimiser car la qualité n’est pas trop affectée et la taille du fichier est beaucoup plus petite.

86
Ryan G

disons que vous avez un modèle appelé Book et que vous y trouverez un champ appelé 'cover_pic'. Dans ce cas, vous pouvez procéder comme 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 aide à tous ceux qui tombent dessus.

9
nash

Voir la fonction miniature du module d’image de PIL. Vous pouvez l'utiliser pour enregistrer des versions plus petites de fichiers sous différents types de fichiers. Si vous souhaitez conserver le plus de qualité possible, envisagez d'utiliser le filtre ANTIALIAS.

Autre que cela, je ne suis pas sûr s'il existe un moyen de spécifier une taille maximale souhaitée. Vous pouvez bien sûr écrire une fonction qui pourrait essayer d’enregistrer plusieurs versions du fichier avec des qualités variables jusqu’à atteindre une certaine taille, en ignorant le reste et en vous donnant l’image souhaitée.

2
Cryptite

Le gestionnaire d'images principal dans PIL est le module PIL de Image.

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 aux arguments de vous voulez réduire encore plus la taille, mais optimiser ne fonctionne que pour les JPEG et les PNG. Pour d'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 simplement un peu de code et en définissant la taille de l'image. Vous ne pouvez comprendre comment procéder que si vous examinez 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 est (presque) normalement fait avec des images horizontales. Pour les images verticales, vous pouvez faire:

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

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

0
Song