【问题标题】:Watermark GIF with Python PIL带有 Python PIL 的水印 GIF
【发布时间】:2013-09-02 22:52:39
【问题描述】:

我正在尝试为 gif 图像添加水印,下面是我的代码:

img = Image.open("my.gif")
watermark = Image.open("watermark.gif")

img.paste(watermark, (1, 1))
img.save("out.gif")

文件:my.gif:

文件:watermark.gif:

输出“out.gif”不再是动画,它显示一帧带水印:

我知道 PIL 支持 GIF 格式,所以我一定是做错了什么。感谢所有帮助。

【问题讨论】:

    标签: python python-2.7 python-imaging-library gif


    【解决方案1】:

    动画 GIF 实际上是一系列图像,其中包含在它们之间切换的规则和时间,您需要修改所有图像并输出所有图像 - 您可以为此使用 images2gif - 或者您可以自己做很多工作.

    使用 images2gif 的示例,从上面的链接下载后:

    from PIL import Image
    import images2gif as i2g
    images = i2g.readGif('Animated.gif', False)
    watermark = Image.open("Watermark.gif")
    for i in images: i.paste(watermark, (1, 1))
    
    i2g.writeGif('Out.gif', images, 0.5) # You may wish to play with the timing, etc.
    exit()
    

    结果:

    【讨论】:

    • 我在 images2gif 上找不到任何文档
    【解决方案2】:

    Images2gif 在 Python 3 上不起作用。我检查了 PIL 文档,它支持读取 GIF 图像,但保存时,图像没有动画。我需要为我们的应用用户上传的图片加水印,我已经完成的代码如下。它适用于非 GIF 图像。

    def watermark(fp, text, position=None, font=None, quality=85):
        if isinstance(fp, bytes):
            fp = BytesIO(fp)
        im = Image.open(fp)
    
        water_im = Image.new("RGBA", im.size)
        water_draw = ImageDraw.ImageDraw(water_im)
        if isinstance(font, str):
            font = ImageFont.truetype(font, 10 + int(im.size[0] / 100))
        if not position:
            water_size = water_draw.textsize(text, font=font)
            position = (im.size[0] - water_size[0] * 1.05,
                        im.size[1] - water_size[1] * 1.2)
        water_draw.text(position, text, font=font)
        water_mask = water_im.convert("L").point(lambda x: min(x, 160))
        water_im.putalpha(water_mask)
    
        if im.format == 'GIF':
            for frame in ImageSequence.Iterator(im):
                frame.paste(water_im, None, water_im)
        else:
            im.paste(water_im, None, water_im)
        out = BytesIO()
        im.save(out, im.format, quality=quality, **im.info)
    
        return out.getvalue()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-01
      • 2012-04-16
      • 2020-12-30
      • 2018-01-09
      相关资源
      最近更新 更多