让 AI 写一个给图片加水印的 Python 脚本

在 Python 中给身份证或图片添加安全斜向水印

在日常工作中,我们经常需要上传身份证或者其他证件照片用于实名认证、开户或者授权。直接上传原图存在 信息泄露风险,一旦图片被他人滥用,可能导致贷款、办卡甚至诈骗问题。

解决方法之一就是给图片加 斜向水印 ,保证水印既覆盖关键区域,又不会破坏原图的可读性。本文将介绍一个 Python 脚本,可以轻松实现斜向平铺水印,并支持命令行参数自定义文字、颜色、透明度等。


脚本功能概览

该脚本可以实现:

  1. 斜向平铺水印,防止裁剪后水印被去除
  2. 文字可自定义,可带日期或用途说明
  3. 字体大小、间距、旋转角度、透明度可调
  4. 文字颜色可自定义(支持 RGB 和 HEX)
  5. 命令行调用 ,支持 -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

通过这个脚本,你可以轻松为身份证、证件照或者任何图片添加 安全、斜向、可定制的水印。这种方式不仅能保护隐私,还能防止证件被滥用。

还可以进一步扩展功能:

  • 自动适配字体大小和间距,根据图片尺寸动态调整水印密度
  • 交替斜向水印,模拟防伪底纹效果
  • 批量处理文件夹中的图片
相关推荐
Python代狂魔24 分钟前
Redis
数据库·redis·python·缓存
做科研的周师兄2 小时前
【机器学习入门】1.2 初识机器学习:从数据到智能的认知之旅
大数据·数据库·人工智能·python·机器学习·数据分析·机器人
王小王-1233 小时前
基于Python的游戏推荐与可视化系统的设计与实现
python·游戏·游戏推荐系统·游戏可视化
go&Python3 小时前
检索模型与RAG
开发语言·python·llama
阿里云大数据AI技术4 小时前
ODPS 十五周年实录 | Data + AI,MaxCompute 下一个15年的新增长引擎
大数据·python·sql
RainbowJie14 小时前
Gemini CLI 与 MCP 服务器:释放本地工具的强大潜力
java·服务器·spring boot·后端·python·单元测试·maven
工作碎碎念4 小时前
NumPy------数值计算
python
工作碎碎念4 小时前
pandas
python
A7bert7775 小时前
【YOLOv5部署至RK3588】模型训练→转换RKNN→开发板部署
c++·人工智能·python·深度学习·yolo·目标检测·机器学习