如何在PIL中缩放动画GIF图像并保留动画

时间:2012-02-03 12:39:37

标签: python image image-processing plone python-imaging-library

我想知道是否可以使用PIL缩放动画GIF图像。特别是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

3 个答案:

答案 0 :(得分:7)

您可以使用images2gif.py来读取GIF,然后单独缩放每个帧。 images2gif将允许您使用一系列图像编写动画gif。

我在互联网上找到的images2gif.py没有处理透明度,所以我解决了这个问题。你可以在这里找到: https://bitbucket.org/bench/images2gif.py

答案 1 :(得分:4)

PIL对动画GIF有一些有限的支持,但正如所说,它是有限的,你必须在非常低的水平上工作才能处理它。

如果你想处理GIF动画,我建议尝试一些比PIL缩放图像的方法。可能,最直接的方法是使用offprocess.Popen进行进程外ImageMagick - (即便如此,我只猜测ImageMagick“使用动画GIF做正确的事情”) -

一个选项是拥有一个“图像处理服务器”,使用另一个Python脚本,除了你的zope安装,它将接收扩展图像的请求 - 可能是通过xmlrpc调用 - 你可以将它构建为一个GIMP插件并使用GIMP缩放GIF。

另一种选择是保持原样,并将“静止图像”用于动画GIF,它们需要出现在原始图像的另一个维度中,并在动画适当的位置显示原始图像。 (或者可能只是要求动画gif已经以适当的大小提交)

答案 2 :(得分:0)

Pillow(PIL的分支)支持自3.0.0版本PR #1384合并后的动画GIF。