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.
Réponses
Trop de publicités?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.
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.
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.
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.
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)
- Réponses précédentes
- Plus de réponses