You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 14:55:14