You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将多张加水印图片保存到同一目录并使用不同文件名?

图片加水印工具代码修改方案

问题根源

原代码每次执行watermark函数时都会强制创建新目录,且固定使用image.png作为保存文件名,导致:

  • 重复选择图片时会因目录已存在抛出异常
  • 新生成的水印图会直接覆盖旧文件

修改后的完整代码

from tkinter import *
from tkinter import filedialog 
from tkinter.ttk import *
from PIL import ImageFont
from PIL import ImageDraw
from PIL import Image, ImageTk
import os

# 定义水印图片的统一保存目录
SAVE_DIR = 'C:/Users/user/Pictures/test/watermarked_images'

# 初始化保存目录:目录不存在则创建
if not os.path.exists(SAVE_DIR):
    os.makedirs(SAVE_DIR)

def watermark(file_path, water_mark_text):
    # 打开图片并转换为RGBA格式(支持透明水印)
    image = Image.open(file_path).convert("RGBA")
    # 创建透明画布用于绘制水印文字
    txt = Image.new('RGBA', image.size, (255,255,255,0))

    image_width, image_height = image.size
    draw = ImageDraw.Draw(txt)

    # 根据图片宽度动态设置字体大小:避免固定字号在高分辨率图上显示过小
    font_size = int(image_width / 4)
    font = ImageFont.truetype('arial.ttf', font_size)

    # 在图片底部偏上位置绘制水印,半透明黑色带深灰描边
    draw.text(
        (int(image_width/2), int(image_height/1.5)),
        water_mark_text,
        fill=(0,0,0,50),
        stroke_fill="#222",
        anchor='mb',
        font=font
    )

    # 合并原图与水印画布
    combined = Image.alpha_composite(image, txt)
    # 预览水印效果
    combined.show()

    # 生成唯一文件名:保留原文件名,添加"_watermarked"后缀,统一保存为PNG格式
    original_file_name = os.path.basename(file_path)
    name, ext = os.path.splitext(original_file_name)
    save_file_name = f"{name}_watermarked.png"
    save_full_path = os.path.join(SAVE_DIR, save_file_name)

    # 保存水印图片
    combined.save(save_full_path)
    print(f"水印图片已保存至:{save_full_path}")

def open_file():
    # 打开文件选择框,仅显示常见图片格式
    file = filedialog.askopenfilename(
        initialdir='Users\\user',
        filetypes=[("图片文件", "*.png *.jpg *.jpeg *.bmp")]
    )
    if file:  # 避免未选择文件时执行后续逻辑
        watermark(file, "XYZ")

# 创建GUI界面
window = Tk()
window.title("图片加水印工具")
window.geometry('300x200')

label = Label(text="选择图片", font=("Arial", 25))
label.place(relx=0.5, rely=0.3, anchor=CENTER)

Button1 = Button(text="选择图片", command=open_file)
Button1.place(relx=0.5, rely=0.5, anchor=CENTER)

window.mainloop()

关键修改说明

  • 目录管理:将目录创建逻辑移到全局初始化阶段,通过os.path.exists判断目录是否存在,避免重复创建报错
  • 文件名处理:提取原文件名称,生成原文件名_watermarked.png格式的唯一文件名,彻底解决文件覆盖问题
  • 优化交互:添加图片类型过滤,防止误选非图片文件;增加空选择判断,避免无意义的函数调用

内容的提问来源于stack exchange,提问作者Charitra Gour

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 03:37:20