Мне интересно, возможно ли масштабировать анимированное GIF-изображение с помощью PIL. В частности, архетипы Plone ImageField в настоящее время теряет анимацию из изображений, масштабированных с использованием метода масштабирования:
def scale(self, data, w, h, default_format = 'PNG'):
""" scale image (with material from ImageTag_Hotfix)"""
#make sure we have valid int's
size = int(w), int(h)
original_file=StringIO(data)
image = PIL.Image.open(original_file)
# consider image mode when scaling
# source images can be mode '1','L,','P','RGB(A)'
# convert to greyscale or RGBA before scaling
# preserve palletted mode (but not pallette)
# for palletted-only image formats, e.g. GIF
# PNG compression is OK for RGBA thumbnails
original_mode = image.mode
img_format = image.format and image.format or default_format
if original_mode == '1':
image = image.convert('L')
elif original_mode == 'P':
image = image.convert('RGBA')
image.thumbnail(size, self.pil_resize_algo)
# decided to only preserve palletted mode
# for GIF, could also use image.format in ('GIF','PNG')
if original_mode == 'P' and img_format == 'GIF':
image = image.convert('P')
thumbnail_file = StringIO()
# quality parameter doesn't affect lossless formats
image.save(thumbnail_file, img_format, quality=self.pil_quality)
thumbnail_file.seek(0)
return thumbnail_file, img_format.lower()
Я знаю, как определить анимированный GIF: следующее значение соответствует True image.format == 'GIF' and image.seek(image.tell()+1)
. Я пытался не переходить в режим RGBA, но это не сработало.
Фон: в нашем экземпляре Plone мы изменили тип изображения по умолчанию, чтобы установить атрибут original_size его поля изображения, чтобы принудительно масштабировать все изображения с соответствующей настройкой качества. Это прекрасно работает для JPEG, но это означает, что в настоящее время мы не можем загружать анимированные GIF-файлы