如何修改Python Pillow代码,为GIF逐帧添加水印而非调整色彩?
合并Pillow代码:给GIF每一帧添加水印并保存
直接上整合后的代码,你可以根据自己的需求调整参数:
from PIL import Image, ImageDraw, ImageFont def add_watermark(image, watermark_text, font_path=None, font_size=20, text_color=(255, 255, 255, 128), position=(10, 10)): # 复制原图避免修改原对象 img_with_watermark = image.copy() # 如果原图是调色板模式,转成RGBA以支持透明水印 if img_with_watermark.mode != 'RGBA': img_with_watermark = img_with_watermark.convert('RGBA') draw = ImageDraw.Draw(img_with_watermark) # 加载字体,font_path为None则使用默认字体 if font_path: font = ImageFont.truetype(font_path, font_size) else: font = ImageFont.load_default(font_size) # 添加水印文本 draw.text(position, watermark_text, font=font, fill=text_color) # 转回原图的模式,保持GIF的兼容性 if image.mode == 'P': img_with_watermark = img_with_watermark.convert(image.mode) return img_with_watermark def process_gif_with_watermark(input_gif, output_gif, watermark_text, **watermark_options): # 打开原GIF with Image.open(input_gif) as gif: frames = [] # 获取原GIF的动画参数 duration = gif.info.get('duration', 100) loop = gif.info.get('loop', 0) # 遍历每一帧 try: while True: # 复制当前帧 frame = gif.copy() # 给当前帧添加水印 processed_frame = add_watermark(frame, watermark_text, **watermark_options) frames.append(processed_frame) # 跳到下一帧 gif.seek(gif.tell() + 1) except EOFError: # 遍历完所有帧后退出循环 pass # 保存处理后的GIF if frames: frames[0].save( output_gif, save_all=True, append_images=frames[1:], duration=duration, loop=loop, disposal=2 # 保持帧的正确叠加方式 ) # 调用示例 if __name__ == "__main__": process_gif_with_watermark( input_gif="input.gif", output_gif="output_with_watermark.gif", watermark_text="你的水印文本", font_size=24, text_color=(0, 0, 0, 100), # 黑色半透明 position=(50, 50) )
关键逻辑说明
加水印函数:
- 先复制原图,避免修改原帧数据
- 自动处理调色板模式(GIF常见模式),转RGBA后添加透明水印,处理完成后转回原模式保证兼容性
- 支持自定义字体、字号、颜色(含透明度)、水印位置
GIF处理函数:
- 读取原GIF的动画参数(帧时长、循环次数),保证处理后的GIF和原动画效果一致
- 通过
seek()遍历所有帧,直到触发EOFError表示帧遍历完成 - 保存时使用
save_all=True和append_images参数保存所有帧,同时保留原GIF的动画属性
注意事项
- 如果需要使用自定义字体,把
font_path参数设置为你的字体文件路径(比如"C:/Windows/Fonts/simhei.ttf") - 水印颜色的第四个值是透明度(0-255),值越小越透明
- 如果原GIF有特殊的帧处理方式,可调整
disposal参数(默认2是替换上一帧)
内容的提问来源于stack exchange,提问作者PRR
相关产品推荐
相关产品推荐

