如何将多张加水印图片保存到同一目录并使用不同文件名?
图片加水印工具代码修改方案
问题根源
原代码每次执行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
相关产品推荐
相关产品推荐

