Python图片水印案例:手把手教你添加文字水印(附完整代码)
目录导读
- 为什么需要为图片添加文字水印?
- Python图片水印的三种主流方案对比
- 环境准备与库安装
- PIL/Pillow实现基础文字水印
- OpenCV实现半透明居中水印
- 批量处理文件夹内图片水印
- 常见问题与问答
- 水印效果优化与SEO建议
为什么需要为图片添加文字水印?
创作与知识产权保护日益重要的今天,Python图片水印案例已成为开发者、自媒体人和电商运营者的刚需,添加文字水印不仅能有效防止图片被盗用,还能提升品牌曝光度,根据Google SEO最佳实践,带有明确版权标识的图片在搜索结果中更容易获得信任分提升。

文字水印相比图片水印的优势:
- 无需额外素材,直接通过代码生成
- 可自适应不同分辨率
- 修改成本低,方便批量操作
Python图片水印的三种主流方案对比
| 方案 | 库 | 优势 | 适用场景 |
|---|---|---|---|
| Pillow | PIL/Pillow | 轻量、纯Python实现 | 简单水印、单图处理 |
| OpenCV | cv2 | 性能高、支持复杂效果 | 批量处理、透明度控制 |
| ReportLab | reportlab | 自定义字体样式 | 排版要求高的文档 |
本文重点讲解Pillow和OpenCV两种最常用方案,这也是百度、必应SEO排名中最受推荐的实现方式。
环境准备与库安装
在终端执行以下命令安装所需库:
pip install Pillow opencv-python numpy
验证安装是否成功:
from PIL import Image, ImageDraw, ImageFont
import cv2
import numpy as np
print("环境准备完成")
案例一:PIL/Pillow实现基础文字水印
这是最经典的Python图片水印案例,适合初学者快速上手。
from PIL import Image, ImageDraw, ImageFont
def add_watermark_pillow(input_path, output_path, text, font_size=50, color=(255,255,255)):
"""
使用Pillow添加文字水印
"""
# 打开图片
img = Image.open(input_path).convert("RGBA")
# 创建透明层
overlay = Image.new("RGBA", img.size, (255,255,255,0))
draw = ImageDraw.Draw(overlay)
# 设置字体(Windows系统使用微软雅黑)
try:
font = ImageFont.truetype("msyh.ttc", font_size)
except:
font = ImageFont.load_default()
# 计算文字位置(右下角)
text_width, text_height = draw.textsize(text, font=font)
position = (img.width - text_width - 20, img.height - text_height - 20)
# 添加水印文字
draw.text(position, text, fill=(*color, 128), font=font)
# 合并图层
watermarked = Image.alpha_composite(img, overlay)
watermarked.save(output_path, "PNG")
print(f"水印已添加到: {output_path}")
# 使用示例
add_watermark_pillow("input.jpg", "output_pillow.png", "© 2025 MyWebsite.cn")
关键参数说明:
fill=(R,G,B,A)最后一个参数控制透明度(0-255)font.truetype加载系统字体,中文水印必须指定中文字体文件textsize用于计算文本精确尺寸
案例二:OpenCV实现半透明居中水印
对于需要半透明效果和自动居中的场景,OpenCV是更优选择。
import cv2
import numpy as np
def add_watermark_opencv(image_path, text, output_path, alpha=0.5, scale=0.6):
"""
使用OpenCV添加居中半透明水印
"""
# 读取图片
img = cv2.imread(image_path)
height, width = img.shape[:2]
# 创建水印背景
overlay = img.copy()
# 设置字体参数
font = cv2.FONT_HERSHEY_SIMPLEX
font_scale = min(width, height) / 800 * scale
thickness = max(1, int(font_scale * 2))
# 计算文字尺寸
text_size = cv2.getTextSize(text, font, font_scale, thickness)[0]
text_x = (width - text_size[0]) // 2
text_y = (height + text_size[1]) // 2
# 添加文字背景框(可选)
bg_coords = (text_x-20, text_y-text_size[1]-20,
text_x+text_size[0]+20, text_y+20)
cv2.rectangle(overlay, (bg_coords[0], bg_coords[1]),
(bg_coords[2], bg_coords[3]), (0,0,0,), -1)
# 添加文字
cv2.putText(overlay, text, (text_x, text_y), font,
font_scale, (255,255,255,), thickness, cv2.LINE_AA)
# 混合透明度
watermarked = cv2.addWeighted(overlay, alpha, img, 1-alpha, 0)
cv2.imwrite(output_path, watermarked)
print(f"OpenCV水印生成完成: {output_path}")
# 使用示例
add_watermark_opencv("input.jpg", "www.yoursite.cn", "output_opencv.jpg")
案例三:批量处理文件夹内图片水印
实际项目中,面对数百张图片时,批量处理是最实用的Python图片水印案例。
import os
from PIL import Image, ImageDraw, ImageFont
def batch_watermark(folder_path, text, output_folder="watermarked"):
"""
批量添加水印
"""
# 创建输出文件夹
if not os.path.exists(output_folder):
os.makedirs(output_folder)
# 支持的图片格式
extensions = ('.jpg', '.jpeg', '.png', '.bmp', '.webp')
for filename in os.listdir(folder_path):
if filename.lower().endswith(extensions):
input_path = os.path.join(folder_path, filename)
output_path = os.path.join(output_folder, filename)
try:
add_watermark_pillow(input_path, output_path, text)
print(f"处理完成: {filename}")
except Exception as e:
print(f"处理失败 {filename}: {e}")
# 使用示例
batch_watermark("./images", "© CompanyName.com")
SEO优化提示:批量处理时,建议在文件名中加入水印标识,如watermarked_001.jpg,有利于图片搜索引擎索引。
常见问题与问答
Q1:添加的中文水印显示为方框怎么办?
A:这是未指定中文字体导致的,必须使用系统支持的中文字体文件路径,
- Windows:
C:/Windows/Fonts/msyh.ttc - Mac:
/System/Library/Fonts/PingFang.ttc - Linux:
/usr/share/fonts/truetype/noto/NotoSansCJK-Regular.ttc
Q2:如何让水印铺满全图作为防拷贝措施?
A:可以使用平铺模式:
def tile_watermark(img_path, text):
img = Image.open(img_path)
draw = ImageDraw.Draw(img)
step_x = 200
step_y = 150
for x in range(0, img.width, step_x):
for y in range(0, img.height, step_y):
draw.text((x, y), text, fill=(128,128,128,50))
img.save("tiled_output.png")
Q3:水印文字太淡或太浓如何调整?
A:Pillow通过颜色的alpha通道控制(0-255),OpenCV通过alpha参数(0-1),建议:
- 浅色背景用深色文字+低透明度
- 深色背景用浅色文字+中透明度
- 一般场景推荐透明度120-180(Pillow)或0.4-0.6(OpenCV)
水印效果优化与SEO建议
视觉优化技巧:
- 使用阴影效果:在文字左上方偏移1-2像素添加深色副本
- 旋转水印:添加
-30°旋转防止他人截取 - 动态缩放:根据图片尺寸自动调整字体大小
- 版权符号:必须使用符号增强法律效力
SEO排名建议:
- 水印文字中包含主关键词(如“Python图片水印案例”)
- 域名/品牌名放在水印后半部分,避免搜索引擎判定为过度优化
- 输出图片时保留EXIF信息(使用
exif=img.info.get('exif')) - 图片命名采用
关键词-序号.jpg格式
最终检查清单:
- ✅ 图片水印清晰度(不影响主体内容)
- ✅ 中文显示无乱码
- ✅ 批量处理效率(每秒>5张图片)
- ✅ 输出格式兼容性(优先PNG支持透明度)
通过以上三个Python图片水印案例,你已经掌握了从单图到批量、从基础到高级的完整技术栈,无论你是保护原创内容,还是进行品牌推广,这些代码都能直接应用到生产环境中。
互动问答:如果你在实际运行中遇到任何问题,欢迎在评论区留下具体的错误信息,我会逐一解答,你的点赞和收藏是支持我继续输出高质量Python教程的最大动力!