Python代码给图片加水印

完整代码

import os  
from PIL import Image  
from PIL import ImageDraw  
from PIL import ImageFont  
import random  
  
# 全局变量,方便调整水印的字体、颜色、大小、路径等参数  
FONT_PATH = "msyh.ttc"      # 字体文件路径
FONT_SIZE = 33              # 字体大小  
FONT_COLOR = (0, 0, 0, 20)  # 水印文字颜色(RGBA)  
ROTATE_ANGLE = 15           # 旋转角度  
TEXT_STEP_X = 40            # 水平方向步长  
TEXT_STEP_Y = 20            # 垂直方向步长  
IMAGE_PATH = "images"       # 待处理图像所在的目录  
WATERMARK_TEXT = ["TXT", "..."]  # 水印内容  
  
def Watermark(fname, text):  
    # 设置中文字体(确保系统中有指定字体文件)  
    try:  
        font = ImageFont.truetype("msyh.ttc", FONT_SIZE)  # 使用全局字体路径和字体大小  
    except IOError:  
        print("字体文件没有找到,请检查字体路径")  
        return  
  
    # 打开图像文件并转换为RGBA模式(确保支持透明通道)  
    try:  
        img = Image.open(fname).convert('RGBA')  # 转换为RGBA模式  
    except Exception as e:  
        print(f"无法打开图片 {fname}: {e}")  
        return  
  
    # 创建文字叠加层,初始化为全透明  
    text_overlay = Image.new("RGBA", img.size, (255, 255, 255, 0))  
    draw = ImageDraw.Draw(text_overlay)  
  
    # 计算水印文本的最大长度和相应的间距  
    t = max(text)  # 获取文本中最长的字符串  
    t_len = len(t)  
  
    # 设置水平和垂直间距以调整水印密度  
    step_x = t_len * FONT_SIZE + TEXT_STEP_X  # 水平方向的步长  
    step_y = t_len * FONT_SIZE // 2 + TEXT_STEP_Y  # 垂直方向的步长  
  
    # 遍历图像区域,逐步绘制水印覆盖整个图像  
    for i in range(0, 2 * img.size[0] + 2 * step_x, step_x):  # 水平方向循环  
        for j in range(0, 2 * img.size[1] + 2 * step_y, step_y):  # 垂直方向循环  
            draw.text((i, j), random.choice(text), font=font, fill=FONT_COLOR)  # 随机选择文本并绘制  
  
    # 旋转水印文字,使其更具视觉效果  
    text_overlay = text_overlay.rotate(ROTATE_ANGLE)  
  
    # 将水印叠加层与原始图像合并  
    image_with_text = Image.alpha_composite(img, text_overlay)  
  
    # 创建 output 目录(如果不存在)  
    output_dir = "output"  
    if not os.path.exists(output_dir):  
        os.makedirs(output_dir)  
  
    # 使用原始文件名保存带水印的图片  
    output_path = os.path.join(output_dir, os.path.basename(fname))  
    image_with_text.save(output_path)  
    print(f"Saved to {output_path}")  
  
def drawText(path, text):  
    if not os.path.exists(path):  
        print("没有这个路径:", path)  
        return  
  
    # 获取目录下所有符合条件的图像文件路径(包括 png, jpg, jpeg, webp)  
    fileList = [os.path.join(fpathe, f) for fpathe, dirs, fs in os.walk(path)  
                for f in fs if f.split(".")[-1].lower() in ["png", "jpg", "jpeg", "webp"] and not f.split(".")[0][-6:] == "marked"]  
  
    # 遍历图像文件并调用 Watermark 函数为其添加水印  
    for img in fileList:  
        Watermark(img, text)  
  
if __name__ == '__main__':  
    # 使用全局变量处理指定目录下的图像文件,并为其添加水印  
    drawText(IMAGE_PATH, WATERMARK_TEXT)

使用方法 :

输入

  1. FONT_PATH:字体文件路径,msyh.ttc 是微软雅黑字体,不需要更改
  2. FONT_SIZE:水印文本的字体大小
  3. FONT_COLOR:水印文本的颜色,这里使用 RGBA(红色、绿色、蓝色、透明度)格式
  4. ROTATE_ANGLE:水印文本的旋转角度,即水印原本是水平添加,后进行旋转,使其呈现出斜方向
  5. TEXT_STEP_XTEXT_STEP_Y: 控制水印在图像中平铺的间距。
    • TEXT_STEP_X 是水平方向的步长,水平方向的步长(step_x)指的是水印文本在图像上水平重复排列时,两个水印之间的水平距离
    • TEXT_STEP_Y 是垂直方向的步长,用于控制水印在图像上垂直排列时,两个水印之间的垂直距离。
    • 因为第三点说了斜着的水印呈现是本来水平方向刻画水印,只是后续进行了旋转形成
  6. IMAGE_PATH:图像文件所在的目录
  7. WATERMARK_TEXT:水印内容,水印文本的列表。可以包含多条文本,程序会随机选择一条文本进行添加。

输出

  • 将加了水印的图片存入 output 目录,如果不存在,会自动创建
  • 水印的图片命名,以源图片名字命名

效果

Pasted image 20250123103052

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值