IOError для savefig JPG в matplotlib

Я пытаюсь сохранить JPG и возникают проблемы. Следующее дает «IOError: ошибка кодировщика -2 при записи файла изображения»

import matplotlib.pyplot as plt
plt.plot([1, 2])
plt.savefig('image.jpg')

Он работает с png, поэтому я попытался:

pip install pillow

как предложено здесь, но он уже установлен в Canopy. Кажется, что это может быть связано с этим ошибка. Я пытался использовать прямой путь, но это тоже не сработало.

ПОЛНОЕ СООБЩЕНИЕ ОБ ОШИБКЕ СЛЕДУЕТ

Wrong JPEG library version: library is 62, caller expects 70
---------------------------------------------------------------------------
IOError                                   Traceback (most recent call last)
/tmp/tmpMQF4j1.py in <module>()
      1 import matplotlib.pyplot as plt
      2 plt.plot([1, 2])
----> 3 plt.savefig('image.jpg')

/home/keith/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/matplotlib/pyplot.pyc in savefig(*args, **kwargs)
    575 def savefig(*args, **kwargs):
    576     fig = gcf()
--> 577     res = fig.savefig(*args, **kwargs)
    578     draw()   # need this if 'transparent=True' to reset colors
    579     return res

/home/keith/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/matplotlib/figure.pyc in savefig(self, *args, **kwargs)
   1468             self.set_frameon(frameon)
   1469 
-> 1470         self.canvas.print_figure(*args, **kwargs)
   1471 
   1472         if frameon:

/home/keith/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/matplotlib/backends/backend_qt5agg.pyc in print_figure(self, *args, **kwargs)
    159 
    160     def print_figure(self, *args, **kwargs):
--> 161         FigureCanvasAgg.print_figure(self, *args, **kwargs)
    162         self.draw()
    163 

/home/keith/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/matplotlib/backend_bases.pyc in print_figure(self, filename, dpi, facecolor, edgecolor, orientation, format, **kwargs)
   2192                 orientation=orientation,
   2193                 bbox_inches_restore=_bbox_inches_restore,
-> 2194                 **kwargs)
   2195         finally:
   2196             if bbox_inches and restore_bbox:

/home/keith/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/matplotlib/backends/backend_agg.pyc in print_jpg(self, filename_or_obj, *args, **kwargs)
    577                 options['quality'] = rcParams['savefig.jpeg_quality']
    578 
--> 579             return image.save(filename_or_obj, format='jpeg', **options)
    580         print_jpeg = print_jpg
    581 

/home/keith/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/PIL/Image.pyc in save(self, fp, format, **params)
   1691 
   1692         try:
-> 1693             save_handler(self, fp, filename)
   1694         finally:
   1695             # do what we can to clean up

/home/keith/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/PIL/JpegImagePlugin.pyc in _save(im, fp, filename)
    695     bufsize = max(ImageFile.MAXBLOCK, bufsize, len(info.get("exif", b"")) + 5)
    696 
--> 697     ImageFile._save(im, fp, [("jpeg", (0, 0)+im.size, 0, rawmode)], bufsize)
    698 
    699 

/home/keith/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/PIL/ImageFile.pyc in _save(im, fp, tile, bufsize)
    495             s = e.encode_to_file(fh, bufsize)
    496             if s < 0:
--> 497                 raise IOError("encoder error %d when writing image file" % s)
    498             e.cleanup()
    499     try:

IOError: encoder error -2 when writing image file 

person Keith    schedule 12.06.2015    source источник
comment
У меня отлично работает в Windows 7, WinPython 3.3.5 и matplotlib 1.4.3.   -  person Zenadix    schedule 16.06.2015
comment
Я подозреваю, что это проблема Canopy.   -  person Keith    schedule 16.06.2015
comment
Это почти наверняка связано с вашей версией PIL. Погуглите полное сообщение об ошибке, и вы многое об этом увидите. Было бы хорошо вставить больше (все) трассировки - в основном, чтобы подтвердить, что ошибка возникает из /site-packages/PIL/ImageFile.py. Также было бы полезно указать ваши версии: ОС, python и matplotlib (и PIL, если вы можете найти номер версии), чтобы помочь воспроизвести ошибку. Я подозреваю, что вам придется найти способ получить более новую версию PIL.   -  person J Richard Snape    schedule 17.06.2015
comment
Вы, кажется, правы. Я добавил полное сообщение. Я использую Canopy 1.5.3.3103 с несколькими, надеюсь, несвязанными надстройками.   -  person Keith    schedule 17.06.2015


Ответы (2)


Мой немедленный ответ будет попробовать

pip install pillow --upgrade

Это обновит вашу версию PIL - возможно, поэтому необходимо получить версию кодировщика 70, а не 62, как указывает первая строка ошибки.

НО

хотя я не знаком с Canopy, я просмотрел их веб-сайт, и оказалось, что они реализуют свою собственный менеджер пакетов (или хотя бы обернуть его). Эта статья кажется, объясняет, как его использовать.

Итак, я бы сначала заглянул туда, нашел PIL или pillow и выбрал вариант обновления. Используйте приведенную выше версию командной строки только в том случае, если она не работает / обновление недоступно / менеджер пакетов недоступен для вашей конкретной подписки.

person J Richard Snape    schedule 17.06.2015
comment
Да, как я уже сказал, это уже пробовали. Команда возвращает уже актуальное требование: подушка в ./Enthought/Canopy_64bit/User/lib/python2.7/site-packages - person Keith; 22.06.2015
comment
Хорошо, вы не сказали, что использовали параметр --upgrade с pip, поэтому я не знал. Вы пробовали это, или собственный менеджер пакетов навеса, или оба? - person J Richard Snape; 22.06.2015
comment
Отлично - теперь я вижу ответ - рад, что вы разобрались :) - person J Richard Snape; 22.06.2015

В диспетчере пакетов есть функция Canopy, которая знает, что пакет установлен, но не использует его. Это означает, что если вы попытаетесь установить или обновить подушку для терминала Canopy, она ничего не сможет сделать. Чтобы дать доступ к подушке, вы должны сделать это через менеджер пакетов.

  1. Инструменты-> Менеджер пакетов
  2. Введите подушку в строку поиска
  3. нажмите на подушку
  4. нажмите установить

Пока была установлена ​​подушка, до этого навес не имел доступа.

person Keith    schedule 22.06.2015