文章目录
- 原文:https://blog.c12th.cn/archives/35.html
- 前言
- 部分代码
- ini文件
- CMD
 
- 完整代码
- 使用教程(打包整理后文件)
- 注意事项
 
- 最后
原文:https://blog.c12th.cn/archives/35.html
前言
之前 图片加水印 是对于静态图片,而现在这个是对动态图片 (.gif) 加水印。

原图

加水印后
部分代码
def add_watermark_to_gif(gif_path, watermark_text, output_path, font_path, font_color, font_size, position):
    # 打开GIF图像
    with Image.open(gif_path) as gif:
        # 检查图像是否为GIF动画
        if gif.is_animated:
            # 获取GIF的帧数和持续时间
            frames = []
            durations = []
            for i in range(gif.n_frames):
                gif.seek(i)
                frame = gif.copy().convert("RGBA")  # 确保帧是RGBA模式
                frames.append(frame)
                durations.append(gif.info['duration'])
            # 为每一帧添加水印
            watermarked_frames = []
            for frame in frames:
                draw = ImageDraw.Draw(frame)
                # 加载字体
                font = ImageFont.truetype(font_path, font_size)
                # 在指定位置绘制水印
                draw.text(position, watermark_text, fill=font_color, font=font)
                watermarked_frames.append(frame)
            # 保存带有水印的GIF
            watermarked_gif = frames[0]
            watermarked_gif.save(
                output_path,
                save_all=True,
                append_images=watermarked_frames[1:],
                durations=durations,
                loop=0
            )
        else:
            # 如果GIF不是动画,只需为单帧添加水印
            with Image.open(gif_path) as img:
                img = img.convert("RGBA")  # 确保图像是RGBA模式
                draw = ImageDraw.Draw(img)
                font = ImageFont.truetype(font_path, font_size)
                draw.text(position, watermark_text, fill=font_color, font=font)
                img.save(output_path)
ini文件
def read_config(ini_path):
    config = configparser.ConfigParser()
    config.read(ini_path)
    # 获取ini
    watermark_text = config['diy']['text']
    font_path = config['diy']['path']
    font_color = tuple(map(int, config['diy']['color'].split(',')))
    font_size = int(config['diy']['size'])
    position = tuple(map(int, config['diy']['xy'].split(',')))
    output = config['diy']['out']
    return watermark_text, font_path, font_color, font_size, position, output
    batch_add_watermark_to_gifs('input', 'user.ini')
[diy]
path = STXINGKA.TTF
size = 36
text = @Reverse
color = 0, 255, 255
xy = 50, 50
out = out
# ini备注
path        水印字体路径
size        水印字体大小
text        水印字体
color       水印字体颜色(RGB)
xy          水印位置坐标X,Y
out         处理后的文件路径
CMD
rd /s /q .\out
rd /s /q .\input
mkdir input
先删除
out和input文件夹,再生成input文件夹
完整代码
# 工程:test
# 创建时间:2024/6/24 23:20
# encoding:utf-8
from PIL import Image, ImageDraw, ImageFont
import os
import configparser
def read_config(ini_path):
    config = configparser.ConfigParser()
    config.read(ini_path)
    # 获取ini
    watermark_text = config['diy']['text']
    font_path = config['diy']['path']
    font_color = tuple(map(int, config['diy']['color'].split(',')))
    font_size = int(config['diy']['size'])
    position = tuple(map(int, config['diy']['xy'].split(',')))
    output = config['diy']['out']
    return watermark_text, font_path, font_color, font_size, position, output
def add_watermark_to_gif(gif_path, watermark_text, output_path, font_path, font_color, font_size, position):
    # 打开GIF图像
    with Image.open(gif_path) as gif:
        # 检查图像是否为GIF动画
        if gif.is_animated:
            # 获取GIF的帧数和持续时间
            frames = []
            durations = []
            for i in range(gif.n_frames):
                gif.seek(i)
                frame = gif.copy().convert("RGBA")  # 确保帧是RGBA模式
                frames.append(frame)
                durations.append(gif.info['duration'])
            # 为每一帧添加水印
            watermarked_frames = []
            for frame in frames:
                draw = ImageDraw.Draw(frame)
                # 加载字体
                font = ImageFont.truetype(font_path, font_size)
                # 在指定位置绘制水印
                draw.text(position, watermark_text, fill=font_color, font=font)
                watermarked_frames.append(frame)
            # 保存带有水印的GIF
            watermarked_gif = frames[0]
            watermarked_gif.save(
                output_path,
                save_all=True,
                append_images=watermarked_frames[1:],
                durations=durations,
                loop=0
            )
        else:
            # 如果GIF不是动画,只需为单帧添加水印
            with Image.open(gif_path) as img:
                img = img.convert("RGBA")  # 确保图像是RGBA模式
                draw = ImageDraw.Draw(img)
                font = ImageFont.truetype(font_path, font_size)
                draw.text(position, watermark_text, fill=font_color, font=font)
                img.save(output_path)
def batch_add_watermark_to_gifs(gif_folder, ini_path):
    watermark_text, font_path, font_color, font_size, position, output = read_config(ini_path)
    # 确保输出文件夹存在
    if not os.path.exists(output):
        os.makedirs(output)
    # 遍历GIF文件夹中的所有文件
    for filename in os.listdir(gif_folder):
        if filename.lower().endswith('.gif'):
            input_path = os.path.join(gif_folder, filename)
            output_path = os.path.join(output, filename)
            add_watermark_to_gif(input_path, watermark_text, output_path, font_path, font_color, font_size, position)
        print(f"{filename}")
batch_add_watermark_to_gifs('input', 'user.ini')
print('图片已批量处理完成!')
使用教程(打包整理后文件)
 \
\
这里的步骤跟 Python日记 - 图片加水印 一致
-  打开 user.ini, 里面的配置可自行修改
-  把将要处理的图片全部放到 input文件夹中
-  双击运行 main.exe
-  等待窗口运行 
-  处理后的图片在 out中
-  双击 删除.bat(这个用于快速清理input和out的文件)
注意事项
-  图片只支持 gif 格式图片 
-  如果需要改字体文件,还需要在 user.ini里修改水印字体路径
path = 水印字体路径
最后
代码已上传到 github 和 gitee
打包整理后文件 蓝奏云 密码:9g98



















