web-dev-qa-db-fra.com

Python copie sur l'objet image PIL

J'essaie de créer un ensemble de miniatures, chacune séparée séparément de l'image originale.

image = Image.open(path)
image = image.crop((left, upper, right, lower))
for size in sizes:
  temp = copy.copy(image)
  temp.thumbnail((size, height), Image.ANTIALIAS)
  temp.save('%s%s%s.%s' % (path, name, size, format), quality=95)

Le code ci-dessus semblait fonctionner correctement, mais en testant, j'ai découvert que certaines images (je ne peux pas dire ce qui est spécial à leur sujet, peut-être uniquement pour le PNG) soulèvent cette erreur:

/usr/local/lib/python2.6/site-packages/PIL/PngImagePlugin.py in read(self=<PIL.PngImagePlugin.PngStream instance>)
line: s = self.fp.read(8)
<type 'exceptions.AttributeError'>: 'NoneType' object has no attribute 'read' 

Sans la copy() ces images fonctionnent très bien.

Je pourrais simplement ouvrir et recadrer l'image à nouveau pour chaque vignette, mais je préfère avoir une meilleure solution.

25
Steffen

Je suppose que copy.copy() ne fonctionne pas pour la classe PIL Image. Essayez d'utiliser Image.copy() à la place, car il existe pour une raison:

image = Image.open(path)
image = image.crop((left, upper, right, lower))
for size in sizes:
  temp = image.copy()  # <-- Instead of copy.copy(image)
  temp.thumbnail((size, height), Image.ANTIALIAS)
  temp.save('%s%s%s.%s' % (path, name, size, format), quality=95)
51
Ferdinand Beyer