在 Python 中给身份证或图片添加安全斜向水印
在日常工作中,我们经常需要上传身份证或者其他证件照片用于实名认证、开户或者授权。直接上传原图存在 信息泄露风险,一旦图片被他人滥用,可能导致贷款、办卡甚至诈骗问题。
解决方法之一就是给图片加 斜向水印 ,保证水印既覆盖关键区域,又不会破坏原图的可读性。本文将介绍一个 Python 脚本,可以轻松实现斜向平铺水印,并支持命令行参数自定义文字、颜色、透明度等。
脚本功能概览
该脚本可以实现:
- 斜向平铺水印,防止裁剪后水印被去除
- 文字可自定义,可带日期或用途说明
- 字体大小、间距、旋转角度、透明度可调
- 文字颜色可自定义(支持 RGB 和 HEX)
- 命令行调用 ,支持
-h
查看使用说明和示例
图片加水印完整脚本
需求理清楚了,接下来让 AI 帮忙写一个 Python 脚本就行了:
ini
import argparse
from PIL import Image, ImageDraw, ImageFont
import datetime
def parse_color(color_str):
"""
解析颜色参数,支持:
- RGB格式:255,0,0
- HEX格式:#FF0000
"""
color_str = color_str.strip()
if color_str.startswith("#") and len(color_str) == 7:
r = int(color_str[1:3], 16)
g = int(color_str[3:5], 16)
b = int(color_str[5:7], 16)
return (r, g, b)
else:
parts = color_str.split(",")
if len(parts) != 3:
raise ValueError("颜色格式错误,应为R,G,B或#RRGGBB")
return tuple(int(p) for p in parts)
def add_slanted_watermark(
input_path, output_path, text=None,
opacity=90, angle=30, spacing=150, font_scale=25, color=(255,0,0)
):
"""
给图片添加斜向平铺水印
"""
# 打开原图
image = Image.open(input_path).convert("RGBA")
width, height = image.size
# 默认文字
if text is None:
today = datetime.date.today().strftime("%Y-%m-%d")
text = f"仅供实名认证使用 {today}"
# 字体大小
try:
font = ImageFont.truetype("msyh.ttc", int(width / font_scale))
except:
font = ImageFont.load_default()
# 创建大画布
diagonal = int((width**2 + height**2) ** 0.5) * 2
watermark = Image.new("RGBA", (diagonal, diagonal), (0, 0, 0, 0))
draw = ImageDraw.Draw(watermark)
# 测量文字大小
bbox = draw.textbbox((0, 0), text, font=font)
text_width, text_height = bbox[2] - bbox[0], bbox[3] - bbox[1]
# 平铺文字
for y in range(0, diagonal, text_height + spacing):
for x in range(0, diagonal, text_width + spacing):
draw.text((x, y), text, fill=color + (opacity,), font=font)
# 旋转水印
watermark = watermark.rotate(angle, expand=1)
# 裁剪回原图大小
x = (watermark.width - width) // 2
y = (watermark.height - height) // 2
watermark = watermark.crop((x, y, x + width, y + height))
# 合成
combined = Image.alpha_composite(image, watermark)
combined.convert("RGB").save(output_path, "JPEG")
print(f"✅ 水印已添加: {output_path}")
# ------------------- 命令行参数 -------------------
def main():
example_text = """示例调用:
# 默认红色水印
python watermark.py img.png out.jpg -t "仅供XX银行使用 2025-08-26"
# 自定义灰色水印
python watermark.py img.png out.jpg -t "仅供XX银行使用" --color 128,128,128
# 自定义蓝色HEX水印
python watermark.py img.png out.jpg --color #0000FF --opacity 100 --angle 45 --font_scale 30 --spacing 120
"""
parser = argparse.ArgumentParser(
description="在图片上添加斜向平铺水印,可自定义文字、字体大小、间距、角度、透明度、颜色。",
epilog=example_text,
formatter_class=argparse.RawDescriptionHelpFormatter
)
parser.add_argument("input", help="输入图片路径(jpg/png)")
parser.add_argument("output", help="输出图片路径(jpg)")
parser.add_argument("-t", "--text", default=None, help="水印文字(默认带日期)")
parser.add_argument("--opacity", type=int, default=90, help="文字透明度 0-255,默认90")
parser.add_argument("--angle", type=float, default=30, help="水印旋转角度,默认30°")
parser.add_argument("--spacing", type=int, default=150, help="水印行列间距,默认150px")
parser.add_argument("--font_scale", type=float, default=25, help="字体大小比例:图片宽度/字体大小,默认25")
parser.add_argument("--color", default="255,0,0", help="文字颜色 RGB格式: R,G,B 或 HEX: #RRGGBB, 默认红色")
args = parser.parse_args()
color = parse_color(args.color)
add_slanted_watermark(
input_path=args.input,
output_path=args.output,
text=args.text,
opacity=args.opacity,
angle=args.angle,
spacing=args.spacing,
font_scale=args.font_scale,
color=color
)
if __name__ == "__main__":
main()
命令行使用方法
脚本支持 命令行参数,可以在调用时灵活调整:
css
python watermark.py input.jpg output.jpg -t "仅供XX银行使用 2025-08-26" \
--color 255,0,0 --opacity 90 --angle 30 --font_scale 25 --spacing 150
参数说明
参数 | 功能 | 默认值 |
---|---|---|
input | 输入图片路径(jpg/png) | 必填 |
output | 输出图片路径 | 必填 |
-t / --text | 水印文字 | 默认"仅供实名认证使用 + 当前日期" |
--opacity | 水印透明度 0-255 | 90 |
--angle | 水印旋转角度 | 30° |
--spacing | 文字间距 | 150px |
--font_scale | 字体大小比例,图片宽度/字体大小 | 25 |
--color | 文字颜色 RGB 或 HEX | 255,0,0 |
调用示例
csharp
# 默认红色水印
python watermark.py img.png out.jpg -t "仅供XX银行使用 2025-08-26"
# 自定义灰色水印
python watermark.py img.png out.jpg -t "仅供XX银行使用" --color 128,128,128
# 自定义蓝色HEX水印
python watermark.py img.png out.jpg --color #0000FF --opacity 100 --angle 45 --font_scale 30 --spacing 120

通过这个脚本,你可以轻松为身份证、证件照或者任何图片添加 安全、斜向、可定制的水印。这种方式不仅能保护隐私,还能防止证件被滥用。
还可以进一步扩展功能:
- 自动适配字体大小和间距,根据图片尺寸动态调整水印密度
- 交替斜向水印,模拟防伪底纹效果
- 批量处理文件夹中的图片