filestools库(win+R,输入cmd,回车)pip install filestoolsfrom watermarker.marker import add_markadd_mark( file="D:/Users/水印", # 输入文件夹 out="D:/Users/水印/添加水印", # 输出文件夹 mark="机密文件 严禁外传", # 水印内容 opacity=0.2, # (可选) 透明度,默认0.15,越大越不透明 space=75, # (可选) 水印间距,默认75 color="#000000", # (可选) 水印颜色,默认#8B8B1B angle=45, # (可选) 水印角度,默认45 size=20# (可选) 水印字体大小,默认20)添加水印后:

Pillow库pip install Pillowimport osfrom PIL import Image, ImageDraw, ImageFont# 1. 设置配置input_folder = "D:/Users/水印"# 你的图片文件夹output_folder = "D:/Users/水印/添加水印"# 结果保存文件夹text = "机密文件 严禁外传"# 水印文字# 自动创建输出文件夹os.makedirs(output_folder, exist_ok=True)# 2. 开始处理for filename in os.listdir(input_folder):if filename.lower().endswith(('.png', '.jpg', '.jpeg')):try:# 打开图片 image_path = os.path.join(input_folder, filename) img = Image.open(image_path) draw = ImageDraw.Draw(img)# --- 设置字体 (如果你是中文,必须用 simhei.ttf 或 msyh.ttf) ---# 这里的 50 是字体大小try: font = ImageFont.truetype("simhei.ttf", 50) except: font = ImageFont.load_default() # 找不到字体就用默认的# --- 计算位置 (放在右下角) ---# 获取文字宽高 bbox = draw.textbbox((0, 0), text, font=font) text_w = bbox[2] - bbox[0] text_h = bbox[3] - bbox[1]# 计算坐标:图片宽 - 文字宽 - 边距(20) x = img.width - text_w - 20 y = img.height - text_h - 20# --- 绘制并保存 ---# fill 参数是颜色,'red'红色, 'white'白色, 或 (255,0,0) draw.text((x, y), text, font=font, fill="red") # 保存到新文件夹 img.save(os.path.join(output_folder, filename)) print(f"成功: {filename}")except Exception as e: print(f"跳过 {filename}: {e}")
左上角:
x = 20y = 20左下角:
x = 20y = img.height - text_h - 20正中间:
x = (img.width - text_w) / 2y = (img.height - text_h) / 2import osfrom PIL import Image, ImageDraw, ImageFontdefadd_watermark_batch(input_dir, output_dir, text, font_size=50, margin=20, opacity=200):""" 批量给图片添加右下角水印 :param input_dir: 原图文件夹路径 :param output_dir: 保存路径 :param text: 水印文字 :param font_size: 字体大小 :param margin: 边距 :param opacity: 透明度 (0-255,255为不透明) """# 1. 如果输出目录不存在,自动创建ifnot os.path.exists(output_dir): os.makedirs(output_dir) print(f"已创建输出目录: {output_dir}")# 2. 获取文件夹内所有文件 files = os.listdir(input_dir)# 3. 遍历处理for filename in files:# 筛选图片格式ifnot filename.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.tiff')):continue input_path = os.path.join(input_dir, filename) output_path = os.path.join(output_dir, filename)try:# 打开图片 image = Image.open(input_path)# 转换为 RGBA 模式以便处理透明度(如果是 JPG 也强制转) image = image.convert("RGBA")# 创建一个和原图一样大的透明图层,专门用来画水印# (255, 255, 255, 0) 代表完全透明 txt_layer = Image.new("RGBA", image.size, (255, 255, 255, 0)) draw = ImageDraw.Draw(txt_layer)# --- 设置字体 ---# 优先尝试 Windows 自带的中文字体 (黑体 simhei.ttf 或 微软雅黑 msyh.ttf)try: font = ImageFont.truetype("simhei.ttf", font_size)except IOError:# 如果找不到,尝试微软雅黑try: font = ImageFont.truetype("msyh.ttf", font_size)except IOError:# 如果都找不到,使用默认字体(注意:默认字体可能不支持中文) print("警告: 未找到中文字体,使用默认字体") font = ImageFont.load_default()# --- 计算文字宽高 ---# draw.textbbox 返回 (left, top, right, bottom) bbox = draw.textbbox((0, 0), text, font=font) text_width = bbox[2] - bbox[0] text_height = bbox[3] - bbox[1]# --- 计算坐标 (默认右下角) ---# 图片宽 - 文字宽 - 边距 x = image.width - text_width - margin y = image.height - text_height - margin# --- 绘制水印 ---# fill=(R, G, B, A) -> 红色(255,0,0), 透明度由 opacity 控制 draw.text((x, y), text, font=font, fill=(255, 0, 0, opacity))# --- 合并图层 ---# 将水印层覆盖到原图上 combined = Image.alpha_composite(image, txt_layer)# --- 保存文件 ---# 如果原图是 JPG,必须转回 RGB 模式(因为 JPG 不支持透明背景)if filename.lower().endswith(('.jpg', '.jpeg')): combined = combined.convert("RGB") combined.save(output_path) print(f"成功: {filename}")except Exception as e: print(f"失败: {filename}, 错误: {e}")# --- 程序入口 ---if __name__ == "__main__":# === 请在这里修改你的配置 === input_folder = "D:/Users/水印"# 你的图片文件夹 output_folder = "D:/Users/水印/添加水印"# 结果保存位置 watermark_text = "机密文件 严禁外传"# 水印内容# 执行函数 add_watermark_batch(input_folder, output_folder, watermark_text)