Python / Django загрузить изображение с URL, изменить и сохранить в ImageField

Я искал способ загрузить изображение с URL-адреса, предварительно настроить некоторые манипуляции с изображениями (изменить его размер), а затем сохранить его в django. ImageField. Используя два замечательных поста (ссылка ниже), я смог загрузить и сохранить изображение в ImageField. Тем не менее, у меня возникли некоторые проблемы при работе с файлом, как только он у меня есть.

В частности, метод save () поля модели требует объект File () в качестве второго параметра. Таким образом, мои данные должны в конечном итоге быть объектом File (). Сообщения блога, ссылки на которые приведены ниже, показывают, как использовать urllib2 для сохранения URL-адреса изображения в объекте File (). Это здорово, однако я также хочу манипулировать изображением, используя PIL как объект Image (). (или объект ImageFile).

Тогда я предпочел бы загрузить URL-адрес изображения непосредственно в объект Image (), предварительно изменить размер и преобразовать его в объект File (), а затем сохранить его в модели. Однако мои попытки конвертировать Image () в File () не увенчались успехом. Если это вообще возможно, я хочу ограничить количество раз, когда я записываю на диск, поэтому я хотел бы выполнить это преобразование объекта в памяти или использовать объект NamedTeoraryFile (delete = True), чтобы мне не приходилось беспокоиться о дополнительные файлы лежали вокруг. (Конечно, я хочу, чтобы файл был записан на диск после его сохранения через модель).

import urllib2
from PIL import Image, ImageFile    
from django.core.files import File
from django.core.files.temp import NamedTemporaryFile

inStream = urllib2.urlopen('http://www.google.com/intl/en_ALL/images/srpr/logo1w.png')

parser = ImageFile.Parser()
while True:
    s = inStream.read(1024)
    if not s:
        break
    parser.feed(s)

inImage = parser.close()
# convert to RGB to avoid error with png and tiffs
if inImage.mode != "RGB":
    inImage = inImage.convert("RGB")

# resize could occur here

# START OF CODE THAT DOES NOT SEEM TO WORK
# I need to somehow convert an image .....

img_temp = NamedTemporaryFile(delete=True)
img_temp.write(inImage.tostring())
img_temp.flush()

file_object = File(img_temp)

# .... into a file that the Django object will accept. 
# END OF CODE THAT DOES NOT SEEM TO WORK

my_model_instance.image.save(
         'some_filename',
         file_object,  # this must be a File() object
         save=True,
         )

При таком подходе файл выглядит поврежденным всякий раз, когда я рассматриваю его как изображение. Есть ли у кого-нибудь подход, который берет файл файла из URL, позволяет ему манипулировать им как изображением и затем сохранять его в Django ImageField?

Любая помощь очень ценится.

Программно сохраняемое изображение в Django ImageField.

Django: добавление изображения в ImageField из URL-адреса изображения.

Обновление 08/11/2010. когда я пытался сохранить его в Django ImageField. В частности, трассировка стека показала ошибку имени:

"AttribueError exception "StringIO instance has no attribute 'name'"

После копания в источнике Django, похоже, эта ошибка была вызвана, когда сохранение модели пытается получить доступ к атрибуту размера StringIO «Файл». (Хотя приведенная выше ошибка указывает на проблему с именем, основной причиной этой ошибки является отсутствие свойства размера на изображении StringIO). Как только я присвоил значение атрибуту size файла изображения, все заработало нормально.

10
задан Community 23 May 2017 в 10:27
поделиться

1 ответ

В попытке убить двух зайцев одним выстрелом. Почему бы не использовать объект (c)StringIO вместо NamedTemporaryFile? Вам больше не придется хранить его на диске, и я точно знаю, что что-то вроде этого работает (я сам использую подобный код).

from cStringIO import StringIO
img_temp = StringIO()
inImage.save(img_temp, 'PNG')
img_temp.seek(0)

file_object = File(img_temp, filename)
4
ответ дан 4 December 2019 в 04:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: