2009-09-10 6 views
45

Je travaille sur PIL et j'ai besoin de savoir si la qualité de l'image peut être ajustée en redimensionnant ou en miniaturisant une image. D'après ce que je sais, la qualité par défaut est définie sur 85. Ce paramètre peut-il être modifié pendant le redimensionnement?Comment ajuster la qualité d'une image redimensionnée dans Python Imaging Library?

Je suis actuellement en utilisant le code suivant:

image = Image.open(filename) 
image.thumbnail((x, y), img.ANTIALIAS) 

Le paramètre ANTIALIAS donne sans doute la meilleure qualité. J'ai besoin de savoir si nous pouvons obtenir plus de granularité sur l'option de qualité.

Répondre

70

méthode Utilisons PIL resize manuellement:

image = image.resize((x, y), Image.ANTIALIAS) # LANCZOS as of Pillow 2.7 

Suivi par la méthode save

quality_val = 90 
image.save(filename, 'JPEG', quality=quality_val) 

Jetez un oeil à la source de models.py de Photologue pour voir comment ils le font.

+1

Merci, thats exactement ce que je cherchais ... Juste un ajout: L'option de qualité est un kwarg donc doit être passé comme qualité = qualité – bigmac

+0

@bigmac - merci, édité en! –

+1

Notez également que si votre image originale est indexée, dans la plupart des cas, elle augmentera la qualité de la sortie si vous la convertissez en 'RGB' ou' RGBA' avant d'appeler '.resize()'. –

44

ANTIALIAS n'est en aucun cas comparable au niveau de qualité "85". Le paramètre ANTIALIAS indique à la méthode de vignette quel algorithme utiliser pour rééchantillonner des pixels d'une taille à une autre. Par exemple, si j'ai une image 3x3 qui ressemble à ceci:

2 2 2 
2 0 2 
2 2 2 

et je redimensionner 2x2, un algorithme peut me donner:

2 2 
2 2 

parce que la plupart des pixels sont à proximité 2s, tandis qu'un autre pourrait me donner:

1 1 
1 1 

afin de prendre en compte le 0 dans le milieu. Mais vous n'avez toujours pas commencé à faire face à la compression, et ne le fera pas tant que vous n'aurez pas sauvegardé l'image. Ce qui veut dire qu'en miniature, vous n'avez pas affaire à des gradations de qualité, mais à des algorithmes discrets pour le rééchantillonnage. Donc non, vous ne pouvez pas obtenir un contrôle plus précis ici.

Si vous enregistrez un format avec compression sans perte, qui est l'endroit idéal pour préciser les niveaux de qualité.

+4

+1, Excellente façon de l'expliquer –

+1

C'est une très bonne explication. A bientôt ... – bigmac

+0

Merci à tous. Heureux que cela soit utile – jcdyer

8

Ne pas confondre redimensionnement et compression.

Pour la meilleure qualité, vous devez utiliser les deux. Voir le code suivant:

from PIL import Image 

image = Image.open(filename) 
image.thumbnail((x, y), Image.ANTIALIAS) 
image.save(filename, quality=100) 

De cette façon, j'ai des pouces très fins dans mes programmes.

+16

"La qualité d'image, sur une échelle de 1 (pire) à 95 (meilleur) La valeur par défaut est 75. Les valeurs supérieures à 95 doivent être évitées, 100 désactive complètement la phase de quantification JPEG." http://www.pythonware.com/library/pil/handbook/format-jpeg.htm –

0

Une façon d'obtenir une meilleure qualité est de faire le downscaling en deux étapes. Par exemple, si votre image originale est 1200x1200 et vous devez le redimensionner à 64x64 pixels, puis sur la première étape downscale à quelque part au milieu de ces deux dimensions:

1200x1200 -> 600x600 -> 64x64

+4

Ceci n'est vrai que si vous utilisez un mauvais filtre de réduction d'échelle. – mattdm

Questions connexes