原文: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 = 水印字体路径
最后
打包整理后文件 蓝奏云 密码:9g98