Изменение размера анимированных картинок с помощью sorl-thumbnail
Есть ли возможность изменить размер анимационных картинок с помощью sorl?
4 ответа
Ух ты, вот такой запрос, который я бы никогда не ожидал! sorl.thumbnail
теперь настраивается на двигатель и поставляется с PIL и pgmagick. Я думаю, что есть способы заставить imagemagick изменять размеры анимированных GIF-файлов, и, возможно, pgmagick сможет это сделать, но я не проверял это, и очень маловероятно, что он будет работать с поставляемыми движками как есть.
У меня есть рабочее решение (проверено с помощью sorl-thumbnail 11.12.1b). Требуется бэкэнд Wand:
#sorl_extensions.py
from sorl.thumbnail.base import (
ThumbnailBackend, EXTENSIONS,
default_settings as thumbnail_default_settings
)
EXTENSIONS.update({'GIF': 'gif'})
class GifThumbnailBackend(ThumbnailBackend):
def _get_format(self, file_):
file_extension = self.file_extension(file_)
if file_extension == '.jpg' or file_extension == '.jpeg':
return 'JPEG'
elif file_extension == '.png':
return 'PNG'
elif file_extension == '.gif':
return 'GIF'
else:
from django.conf import settings
return getattr(settings, 'THUMBNAIL_FORMAT', thumbnail_default_settings.THUMBNAIL_FORMAT)
#settings.py
THUMBNAIL_ENGINE = 'sorl.thumbnail.engines.wand_engine.Engine'
THUMBNAIL_BACKEND = 'tools.sorl_extensions.GifThumbnailBackend'
THUMBNAIL_PRESERVE_FORMAT = True
Мне удалось заставить SORL работать с GIF.
- Вам нужно использовать графический магический или графический магический бэкэнд (PIL не поддерживает изменение размера gif без какого-либо взлома). Вы также можете попробовать pgmagick, но я не знаю, сработает ли это.
Поместите это где-нибудь в своем коде:
from sorl.thumbnail import base base.EXTENSIONS.update({'GIF': 'gif'})
Вы можете взглянуть на источник sorl-thumnail, чтобы узнать, как это работает
UPD: не проверено. Используйте это, только если вы уверены, что делаете.
Я поделюсь своим примером:
# -*- coding: utf-8 -*-
import os
from sorl.thumbnail import get_thumbnail
def get_file_extension(obj):
filename, file_extension = os.path.splitext(obj)
return file_extension
def get_thumbnail_size(obj, size):
img_format = 'JPEG'
if get_file_extension(obj.url) == '.png':
img_format = 'PNG'
if get_file_extension(obj.url) == '.gif':
from sorl.thumbnail import base
base.EXTENSIONS.update({'GIF': 'gif'})
img_format = 'GIF'
return get_thumbnail(obj, size, quality=90, format=img_format).url