完整代码
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)
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
try:
img = Image.open(fname).convert('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_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
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"]
for img in fileList:
Watermark(img, text)
if __name__ == '__main__':
drawText(IMAGE_PATH, WATERMARK_TEXT)
使用方法 :
输入
FONT_PATH
:字体文件路径,msyh.ttc
是微软雅黑字体,不需要更改FONT_SIZE
:水印文本的字体大小FONT_COLOR
:水印文本的颜色,这里使用 RGBA(红色、绿色、蓝色、透明度)格式ROTATE_ANGLE
:水印文本的旋转角度,即水印原本是水平添加,后进行旋转,使其呈现出斜方向TEXT_STEP_X
和 TEXT_STEP_Y
: 控制水印在图像中平铺的间距。
TEXT_STEP_X
是水平方向的步长,水平方向的步长(step_x
)指的是水印文本在图像上水平重复排列时,两个水印之间的水平距离TEXT_STEP_Y
是垂直方向的步长,用于控制水印在图像上垂直排列时,两个水印之间的垂直距离。- 因为第三点说了斜着的水印呈现是本来水平方向刻画水印,只是后续进行了旋转形成
IMAGE_PATH
:图像文件所在的目录WATERMARK_TEXT
:水印内容,水印文本的列表。可以包含多条文本,程序会随机选择一条文本进行添加。
输出
- 将加了水印的图片存入
output
目录,如果不存在,会自动创建 - 水印的图片命名,以源图片名字命名
效果
