繁体   English   中英

带有Python PIL的水印GIF

[英]Watermark GIF with Python PIL

我正在尝试为gif图像加水印的方法,以下是我的代码:

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

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

文件:my.gif:

my.gif

文件:watermark.gif:

水印Gif

输出“ out.gif”不再具有动画效果,它显示带有水印的一帧: Out.gif

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

动画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在Python 3上不起作用。我检查了PIL doc,它支持读取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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM