Django PIL: IOError Не удается определить файл образа

Я изучаю Python и Django.

Изображение предоставляется пользователем с помощью forms.ImageField (). Затем я должен обработать его, чтобы создать два изображения разных размеров.

Когда я отправляю форму, Django возвращает следующую ошибку:

IOError at /add_event/ cannot identify image file 

Я вызываю функцию изменения размера:

 def create_event(owner_id, name, image): image_thumb = image_resizer(image, name, '_t', 'events', 180, 120) image_medium = image_resizer(image, name, '_m', 'events', 300, 200) 

Я получаю ошибку en при вызове image_resizer во второй раз:

 def image_resizer(image, name, size, app_name, length, height): im = Image.open(image) if im.mode != "RGB": im = im.convert("RGB") im = create_thumb(im, length, height) posit = str(MEDIA_ROOT)+'/'+app_name+'/' image_2 = im image_name = name + size +'.jpg' imageurl = posit + image_name image_2.save(imageurl,'JPEG',quality=80) url_image='/'+app_name+'/'+image_name return url_image 

Версии:
Django 1.3.1
Python 2.7.1
PIL 1.1.7

Я пытаюсь найти проблему, но я не знаю, что делать. Заранее благодарю!

РЕДАКТИРОВАТЬ
Я решил переписать функцию; теперь он создает разные изображения в партии:

Я вызываю функцию изменения размера:

 url_array = image_resizer.resize_batch(image, image_name, [[180,120,'_t'], [300,200,'_m']], '/events/') 

так:

 image_thumb = url_array[0] image_medium = url_array[1] 

и функция изменения размера:

 def resize_batch(image, name, size_array, position): im = Image.open(image) if im.mode != "RGB": im = im.convert("RGB") url_array = [] for size in size_array: new_im = create_thumb(im, size[0], size[1]) posit = str(MEDIA_ROOT) + position image_name = name + size[2] +'.jpg' imageurl = posit + image_name new_im.save(imageurl,'JPEG',quality=90) new_url_array = position + image_name url_array.append(new_url_array) return url_array 

Спасибо всем!

2 Solutions collect form web for “Django PIL: IOError Не удается определить файл образа”

Как ильвар спрашивает в комментариях, что это за объект? Я собираюсь предположить для целей этого ответа, что это свойство file Django ImageField которое поступает из файла, загруженного удаленным пользователем.

После загрузки файла объект, который вы получаете в свойстве ImageField.file является объектом TemporaryUploadedFile который может представлять собой файл на диске или в памяти , в зависимости от того, насколько велика была загрузка. Этот объект ведет себя как обычный объект файла Python , поэтому после того, как вы его прочитали один раз (чтобы сделать первый миниатюру), вы достигли конца файла, чтобы при попытке прочитать его снова (чтобы сделать вторую миниатюру ), там ничего нет, следовательно, IOError . Чтобы сделать второй миниатюру, вам нужно вернуться к началу файла. Таким образом, вы можете добавить строку

 image.seek(0) 

к началу вашей функции image_resizer .

Но это не нужно! У вас есть эта проблема, потому что вы просите Python Imaging Library перечитать образ для каждого нового эскиза, который вы хотите создать. Это пустая трата времени: лучше прочитать изображение только один раз, а затем создать все нужные миниатюры.

Я предполагаю, что это TemporaryUploadedFile … найти это с типом (изображением).

 import cStringIO if isinstance(image, TemporaryUploadedFile): temp_file = open(image.temporary_file_path(), 'rb+') content = cStringIO.StringIO(temp_file.read()) image = Image.open(content) temp_file.close() 

Я не уверен на 100% вышеприведенного кода … приходит из 2 классов, которые у меня есть для манипуляций с изображениями … но попробуйте.

Если это InMemoryUploadedFile ваш код должен работать!

  • Mac osx lion, virtualenv, pil install - ошибка gcc
  • Изменение цвета изображения на основе значения RGB
  • Python / Django скачать изображение с URL, изменить и сохранить в ImageField
  • Использование Pycairo для генерации изображений динамически и обслуживания в Django
  • Как я могу создать изображение PIL из файла в памяти?
  • Как использовать PIL с PyPy?
  • Рисование прямоугольника с использованием событий мыши в Tkinter
  • Значения пикселей Python и PIL различаются для GIF и JPEG
  • Какой формат создает «adb screencap /sdcard/screenshot.raw»? (без флага «-p»)
  • Изображение изображения изображения Python при изменении размера
  • Как удалить ось y из созданного Pylab изображения?
  • Python - лучший язык программирования в мире.