web-dev-qa-db-fra.com

Comment ajuster la qualité d'une image redimensionnée dans Python Imaging Library?

Je travaille sur PIL et j'ai besoin de savoir si la qualité de l'image peut être ajustée lors du redimensionnement ou de la miniature d'une image. D'après ce que je sais, la qualité par défaut est réglée sur 85. Ce paramètre peut-il être modifié pendant le redimensionnement?

J'utilise actuellement le code suivant:

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

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

53
bigmac

Utilisez la méthode resize de PIL manuellement:

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

Suivi par la méthode de sauvegarde

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

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

82
Dominic Rodger

ANTIALIAS n'est en aucun cas comparable au niveau de qualité "85". Le paramètre ANTIALIAS indique à la méthode des miniatures quel algorithme utiliser pour rééchantillonner les 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 le redimensionne à 2x2, un algorithme pourrait me donner:

2 2
2 2

car la plupart des pixels à proximité sont des 2, alors qu'un autre pourrait me donner:

1 1
1 1

afin de prendre en compte le 0 au milieu. Mais vous n'avez toujours pas commencé à gérer la compression, et vous ne le ferez pas tant que vous n'aurez pas enregistré l'image. C'est-à-dire qu'en vignette, il ne s'agit pas de gradations de qualité, mais d'algorithmes discrets de rééchantillonnage. Donc non, vous ne pouvez pas obtenir un meilleur contrôle ici.

Si vous enregistrez dans un format avec compression avec perte, c'est l'endroit pour spécifier les niveaux de qualité.

46
jcdyer

Ne confondez pas le redimensionnement et la 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 de très bons pouces dans mes programmes.

11
DenisKolodin

Antialias n définir la qualité comme 90

   img = img.resize((128,128),Image.ANTIALIAS)
   img.save(os.path.join(output_dir+'/'+x,newfile),"JPEG",quality=90)

http://www.dzone.com/snippets/resize-thousands-images-python

1
ngakak