Python图片水印案例如何添加文字水印

wen python案例 25

Python图片水印案例:手把手教你添加文字水印(附完整代码)

目录导读

  1. 为什么需要为图片添加文字水印?
  2. Python图片水印的三种主流方案对比
  3. 环境准备与库安装
  4. PIL/Pillow实现基础文字水印
  5. OpenCV实现半透明居中水印
  6. 批量处理文件夹内图片水印
  7. 常见问题与问答
  8. 水印效果优化与SEO建议

为什么需要为图片添加文字水印?

创作与知识产权保护日益重要的今天,Python图片水印案例已成为开发者、自媒体人和电商运营者的刚需,添加文字水印不仅能有效防止图片被盗用,还能提升品牌曝光度,根据Google SEO最佳实践,带有明确版权标识的图片在搜索结果中更容易获得信任分提升。

Python图片水印案例如何添加文字水印

文字水印相比图片水印的优势:

  • 无需额外素材,直接通过代码生成
  • 可自适应不同分辨率
  • 修改成本低,方便批量操作

Python图片水印的三种主流方案对比

方案 优势 适用场景
Pillow PIL/Pillow 轻量、纯Python实现 简单水印、单图处理
OpenCV cv2 性能高、支持复杂效果 批量处理、透明度控制
ReportLab reportlab 自定义字体样式 排版要求高的文档

本文重点讲解PillowOpenCV两种最常用方案,这也是百度、必应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. 使用阴影效果:在文字左上方偏移1-2像素添加深色副本
  2. 旋转水印:添加-30°旋转防止他人截取
  3. 动态缩放:根据图片尺寸自动调整字体大小
  4. 版权符号:必须使用符号增强法律效力

SEO排名建议:

  • 水印文字中包含主关键词(如“Python图片水印案例”)
  • 域名/品牌名放在水印后半部分,避免搜索引擎判定为过度优化
  • 输出图片时保留EXIF信息(使用exif=img.info.get('exif')
  • 图片命名采用关键词-序号.jpg格式

最终检查清单:

  • ✅ 图片水印清晰度(不影响主体内容)
  • ✅ 中文显示无乱码
  • ✅ 批量处理效率(每秒>5张图片)
  • ✅ 输出格式兼容性(优先PNG支持透明度)

通过以上三个Python图片水印案例,你已经掌握了从单图到批量、从基础到高级的完整技术栈,无论你是保护原创内容,还是进行品牌推广,这些代码都能直接应用到生产环境中。

互动问答:如果你在实际运行中遇到任何问题,欢迎在评论区留下具体的错误信息,我会逐一解答,你的点赞和收藏是支持我继续输出高质量Python教程的最大动力!

抱歉,评论功能暂时关闭!