我正在尝试找到一种为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格式,所以我一定做错了。感谢所有帮助。
答案 0 :(得分:4)
动画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()
结果如下:
答案 1 :(得分:1)
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()