Python代码给图片加水印


完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import os  
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
import random

# 全局变量,方便调整水印的字体、颜色、大小、路径等参数
FONT_PATH = "msyh.ttc" # 字体文件路径
FONT_SIZE = 33 # 字体大小
FONT_COLOR = (0, 0, 0, 20) # 水印文字颜色(RGBA)
ROTATE_ANGLE = 15 # 旋转角度
TEXT_STEP_X = 40 # 水平方向步长
TEXT_STEP_Y = 20 # 垂直方向步长
IMAGE_PATH = "images" # 待处理图像所在的目录
WATERMARK_TEXT = ["TXT", "..."] # 水印内容

def Watermark(fname, text):
# 设置中文字体(确保系统中有指定字体文件)
try:
font = ImageFont.truetype("msyh.ttc", FONT_SIZE) # 使用全局字体路径和字体大小
except IOError:
print("字体文件没有找到,请检查字体路径")
return

# 打开图像文件并转换为RGBA模式(确保支持透明通道)
try:
img = Image.open(fname).convert('RGBA') # 转换为RGBA模式
except Exception as e:
print(f"无法打开图片 {fname}: {e}")
return

# 创建文字叠加层,初始化为全透明
text_overlay = Image.new("RGBA", img.size, (255, 255, 255, 0))
draw = ImageDraw.Draw(text_overlay)

# 计算水印文本的最大长度和相应的间距
t = max(text) # 获取文本中最长的字符串
t_len = len(t)

# 设置水平和垂直间距以调整水印密度
step_x = t_len * FONT_SIZE + TEXT_STEP_X # 水平方向的步长
step_y = t_len * FONT_SIZE // 2 + TEXT_STEP_Y # 垂直方向的步长

# 遍历图像区域,逐步绘制水印覆盖整个图像
for i in range(0, 2 * img.size[0] + 2 * step_x, step_x): # 水平方向循环
for j in range(0, 2 * img.size[1] + 2 * step_y, step_y): # 垂直方向循环
draw.text((i, j), random.choice(text), font=font, fill=FONT_COLOR) # 随机选择文本并绘制

# 旋转水印文字,使其更具视觉效果
text_overlay = text_overlay.rotate(ROTATE_ANGLE)

# 将水印叠加层与原始图像合并
image_with_text = Image.alpha_composite(img, text_overlay)

# 创建 output 目录(如果不存在)
output_dir = "output"
if not os.path.exists(output_dir):
os.makedirs(output_dir)

# 使用原始文件名保存带水印的图片
output_path = os.path.join(output_dir, os.path.basename(fname))
image_with_text.save(output_path)
print(f"Saved to {output_path}")

def drawText(path, text):
if not os.path.exists(path):
print("没有这个路径:", path)
return

# 获取目录下所有符合条件的图像文件路径(包括 png, jpg, jpeg, webp)
fileList = [os.path.join(fpathe, f) for fpathe, dirs, fs in os.walk(path)
for f in fs if f.split(".")[-1].lower() in ["png", "jpg", "jpeg", "webp"] and not f.split(".")[0][-6:] == "marked"]

# 遍历图像文件并调用 Watermark 函数为其添加水印
for img in fileList:
Watermark(img, text)

if __name__ == '__main__':
# 使用全局变量处理指定目录下的图像文件,并为其添加水印
drawText(IMAGE_PATH, WATERMARK_TEXT)

使用方法 :

输入

  1. FONT_PATH:字体文件路径,msyh.ttc 是微软雅黑字体,不需要更改
  2. FONT_SIZE:水印文本的字体大小
  3. FONT_COLOR:水印文本的颜色,这里使用 RGBA(红色、绿色、蓝色、透明度)格式
  4. ROTATE_ANGLE:水印文本的旋转角度,即水印原本是水平添加,后进行旋转,使其呈现出斜方向
  5. TEXT_STEP_XTEXT_STEP_Y: 控制水印在图像中平铺的间距。
    • TEXT_STEP_X 是水平方向的步长,水平方向的步长(step_x)指的是水印文本在图像上水平重复排列时,两个水印之间的水平距离
    • TEXT_STEP_Y 是垂直方向的步长,用于控制水印在图像上垂直排列时,两个水印之间的垂直距离。
    • 因为第三点说了斜着的水印呈现是本来水平方向刻画水印,只是后续进行了旋转形成
  6. IMAGE_PATH:图像文件所在的目录
  7. WATERMARK_TEXT:水印内容,水印文本的列表。可以包含多条文本,程序会随机选择一条文本进行添加。

输出

  • 将加了水印的图片存入 output 目录,如果不存在,会自动创建
  • 水印的图片命名,以源图片名字命名

效果

Pasted image 20250123103052