当前位置:首页>python>使用Python给图片加水印

使用Python给图片加水印

  • 2026-10-21 13:30:29
使用Python给图片加水印

方法一:

  • 安装filestools库(win+R,输入cmd,回车)
pip install filestools
  • 添加水印
from watermarker.marker import add_markadd_mark(    file="D:/Users/水印",           # 输入文件夹    out="D:/Users/水印/添加水印",    # 输出文件夹    mark="机密文件 严禁外传",     # 水印内容    opacity=0.2,                # (可选) 透明度,默认0.15,越大越不透明    space=75,                   # (可选) 水印间距,默认75    color="#000000",            # (可选) 水印颜色,默认#8B8B1B    angle=45,                   # (可选) 水印角度,默认45    size=20# (可选) 水印字体大小,默认20)

添加水印后:

方法二:

只添加一个水印
  • 安装Pillow库
pip install Pillow
  • 添加水印
import osfrom PIL import Image, ImageDraw, ImageFont# 1. 设置配置input_folder = "D:/Users/水印"# 你的图片文件夹output_folder = "D:/Users/水印/添加水印"# 结果保存文件夹text = "机密文件 严禁外传"# 水印文字# 自动创建输出文件夹os.makedirs(output_folder, exist_ok=True)# 2. 开始处理for filename in os.listdir(input_folder):if filename.lower().endswith(('.png', '.jpg', '.jpeg')):try:# 打开图片            image_path = os.path.join(input_folder, filename)            img = Image.open(image_path)            draw = ImageDraw.Draw(img)# --- 设置字体 (如果你是中文,必须用 simhei.ttf 或 msyh.ttf) ---# 这里的 50 是字体大小try:                font = ImageFont.truetype("simhei.ttf", 50) except:                font = ImageFont.load_default() # 找不到字体就用默认的# --- 计算位置 (放在右下角) ---# 获取文字宽高            bbox = draw.textbbox((0, 0), text, font=font)            text_w = bbox[2] - bbox[0]            text_h = bbox[3] - bbox[1]# 计算坐标:图片宽 - 文字宽 - 边距(20)            x = img.width - text_w - 20            y = img.height - text_h - 20# --- 绘制并保存 ---# fill 参数是颜色,'red'红色, 'white'白色, 或 (255,0,0)            draw.text((x, y), text, font=font, fill="red") # 保存到新文件夹            img.save(os.path.join(output_folder, filename))            print(f"成功: {filename}")except Exception as e:            print(f"跳过 {filename}: {e}")
  • 调整水印的位置

左上角:

x = 20y = 20

左下角:

x = 20y = img.height - text_h - 20

正中间:

x = (img.width - text_w) / 2y = (img.height - text_h) / 2

方法三:

  • 函数形式
import osfrom PIL import Image, ImageDraw, ImageFontdefadd_watermark_batch(input_dir, output_dir, text, font_size=50, margin=20, opacity=200):"""    批量给图片添加右下角水印    :param input_dir: 原图文件夹路径    :param output_dir: 保存路径    :param text: 水印文字    :param font_size: 字体大小    :param margin: 边距    :param opacity: 透明度 (0-255,255为不透明)    """# 1. 如果输出目录不存在,自动创建ifnot os.path.exists(output_dir):        os.makedirs(output_dir)        print(f"已创建输出目录: {output_dir}")# 2. 获取文件夹内所有文件    files = os.listdir(input_dir)# 3. 遍历处理for filename in files:# 筛选图片格式ifnot filename.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.tiff')):continue        input_path = os.path.join(input_dir, filename)        output_path = os.path.join(output_dir, filename)try:# 打开图片            image = Image.open(input_path)# 转换为 RGBA 模式以便处理透明度(如果是 JPG 也强制转)            image = image.convert("RGBA")# 创建一个和原图一样大的透明图层,专门用来画水印# (255, 255, 255, 0) 代表完全透明            txt_layer = Image.new("RGBA", image.size, (255, 255, 255, 0))            draw = ImageDraw.Draw(txt_layer)# --- 设置字体 ---# 优先尝试 Windows 自带的中文字体 (黑体 simhei.ttf 或 微软雅黑 msyh.ttf)try:                font = ImageFont.truetype("simhei.ttf", font_size)except IOError:# 如果找不到,尝试微软雅黑try:                    font = ImageFont.truetype("msyh.ttf", font_size)except IOError:# 如果都找不到,使用默认字体(注意:默认字体可能不支持中文)                    print("警告: 未找到中文字体,使用默认字体")                    font = ImageFont.load_default()# --- 计算文字宽高 ---# draw.textbbox 返回 (left, top, right, bottom)            bbox = draw.textbbox((0, 0), text, font=font)            text_width = bbox[2] - bbox[0]            text_height = bbox[3] - bbox[1]# --- 计算坐标 (默认右下角) ---# 图片宽 - 文字宽 - 边距            x = image.width - text_width - margin            y = image.height - text_height - margin# --- 绘制水印 ---# fill=(R, G, B, A) -> 红色(255,0,0), 透明度由 opacity 控制            draw.text((x, y), text, font=font, fill=(255, 0, 0, opacity))# --- 合并图层 ---# 将水印层覆盖到原图上            combined = Image.alpha_composite(image, txt_layer)# --- 保存文件 ---# 如果原图是 JPG,必须转回 RGB 模式(因为 JPG 不支持透明背景)if filename.lower().endswith(('.jpg', '.jpeg')):                combined = combined.convert("RGB")            combined.save(output_path)            print(f"成功: {filename}")except Exception as e:            print(f"失败: {filename}, 错误: {e}")# --- 程序入口 ---if __name__ == "__main__":# === 请在这里修改你的配置 ===    input_folder = "D:/Users/水印"# 你的图片文件夹    output_folder = "D:/Users/水印/添加水印"# 结果保存位置    watermark_text = "机密文件 严禁外传"# 水印内容# 执行函数    add_watermark_batch(input_folder, output_folder, watermark_text)

最新文章

随机文章