Сохранение анимированных GIF-файлов с использованием PIL (сохраненное изображение не анимируется) - PullRequest
3 голосов
/ 10 января 2011

У меня есть Apache2 + PIL + Django + X-sendfile.Моя проблема в том, что когда я сохраняю анимированный GIF-файл, он не «анимируется» при выводе через браузер.

Вот мой код для отображения изображения, расположенного за пределами общедоступного каталога.1004 *

ОБНОВЛЕНИЕ

Оказывается, это работает.Моя проблема, когда я пытаюсь загрузить изображение через URL.Это, вероятно, не сохраняет весь GIF?

def handle_url_file(request):
    """
    Open a file from a URL.
    Split the file to get the filename and extension.
    Generate a random uuid using rand1()
    Then save the file.
    Return the UUID when successful.
    """

    try:
        file = urllib.urlopen(request.POST['url'])
        randname = rand1(settings.RANDOM_ID_LENGTH)
        newfilename = request.POST['url'].split('/')[-1]
        ext = str(newfilename.split('.')[-1]).lower()
        im = cStringIO.StringIO(file.read()) # constructs a StringIO holding the image
        img = Image.open(im)

        filehash = checkhash(im)

        image = Uploads.objects.get(filehash=filehash)
        uuid = image.uuid

        return "%s" % (uuid)

    except Uploads.DoesNotExist:

        img.save(os.path.join(settings.UPLOAD_DIRECTORY,(("%s.%s")%(randname,ext))))
        del img

        filesize = os.stat(os.path.join(settings.UPLOAD_DIRECTORY,(("%s.%s")%(randname,ext)))).st_size
        upload = Uploads(
            ip          = request.META['REMOTE_ADDR'],
            filename    = newfilename,
            uuid        = randname,
            ext         = ext,
            path        = settings.UPLOAD_DIRECTORY,
            views       = 1,
            bandwidth   = filesize,
            source      = request.POST['url'],
            size        = filesize,
            filehash    = filehash,
        )

        upload.save()
        #return uuid
        return "%s" % (upload.uuid)
    except IOError, e:
        raise e

Есть идеи?

Спасибо!

Венберт

Ответы [ 2 ]

3 голосов
/ 10 января 2011

Откуда взялся этот класс Image и что делает Image.open?

Я предполагаю, что он выполняет некоторую очистку данных изображения (что хорошо), но сохраняет толькопервый кадр Gif.

Редактировать:

Я убежден, что это проблема с PIL.Документация PIL для GIF гласит:

PIL считывает версии GIF87a и GIF89a формата файла GIF.Библиотека записывает закодированные файлы GIF87a длины прогона.

Для проверки вы можете записать содержимое im непосредственно на диск и сравнить с исходным образом.

1 голос
/ 27 февраля 2013

Проблема заключается в сохранении PIL-открытой версии изображения. Когда вы сохраните его через PIL, он сохранит только первый кадр.

Однако есть простой обходной путь: создайте временную копию файла, откройте ее с помощью PIL, а затем, если вы обнаружите, что это анимированный GIF, просто сохраните оригинальный файл, а не версию, открытую PIL. *

Если вы сохраните оригинальный анимированный GIF-файл и затем вернете его обратно в свой HTTP-ответ, он будет анимирован в браузер.

Пример кода для определения, является ли ваш объект PIL анимированным GIF:

def image_is_animated_gif(image):
    # verify image format
    if image.format.lower() != 'gif':
        return False

    # verify GIF is animated by attempting to seek beyond the initial frame
    try:
        image.seek(1)
    except EOFError:
        return False
    else:
        return True
...