在日常工作中,经常需要给图片添加水印,手动添加不仅费时间,而且还很难做到格式统一、位置一致。前几天就遇到朋友询问,说需要对大量图片截图,为了防止外泄,需要给每张照片添加水印,手动操作需要很长时间,问有没有高效的方法。对于这种重复性的工作,Python正是它的长项,只需要20行代码就能轻松搞定,眨眨眼的工夫就能完成原本几个小时的活儿。from pathlib import Pathfrom PIL import Image, ImageDraw, ImageFontfolder = Path(r"C:\Users\Administrator\Desktop\加水印") # 图片文件夹路径text = "数海话表图" # 水印文字color = (255, 182, 193, 128) # 浅红色(RGBA,最后一位是透明度)angle = 45 # 倾斜角度font_size = 80 # 字体大小font = ImageFont.truetype("simhei.ttf", font_size)for file in folder.glob("*.[jp][pn]g"): file_new = file.with_stem(f"{file.stem}_加水印") img = Image.open(file).convert("RGBA") watermark = Image.new("RGBA", img.size, (255, 255, 255, 0)) draw = ImageDraw.Draw(watermark) bbox = draw.textbbox((0,0),text,font=font) w,h = bbox[2] - bbox[0] ,bbox[3] - bbox[1] draw.text(((img.width - w) / 2, (img.height - h) / 2), text, font=font, fill=color) watermark = watermark.rotate(angle, expand=0, fillcolor=(255, 255, 255, 0)) final = Image.alpha_composite(img, watermark).convert("RGB") final.save(file_new, quality=95) print(f"处理完成:{file}")
from pathlib import Pathfrom PIL import Image, ImageDraw, ImageFont
pathlib用来处理文件和文件夹的路径,能轻松定位文件和文件夹。PIL用来处理图片,Image负责图片的打开和保存,ImageDraw用来绘制文字和图形,ImageFont用来设置字体等。folder = Path(r"C:\Users\Administrator\Desktop\加水印") # 图片文件夹路径text = "数海话表图" # 水印文字color = (255, 182, 193, 128) # 浅红色(RGBA,最后一位是透明度)angle = 45 # 倾斜角度font_size = 80 # 字体大小font = ImageFont.truetype("simhei.ttf", font_size)
Path(r"C:\Users\Administrator\Desktop\加水印")是保存图片的文件夹。注意前面加r是避免路径里的反斜杠被转义引发问题。color = (255, 182, 193, 128) :设置字体颜色和透明度,前三个数字是字体颜色设置,依次为红、绿、蓝,第四个数字为透明度,数值区间均为0-255。
angle = 45:水印的旋转角度,可根据实际来设置。
font_size = 80:文字的字号大小。
ImageFont.truetype("simhei.ttf", font_size):加载字体,simhei.ttf是常见的中文字体文件——黑体。
第三步、遍历并处理每张图片
for file in folder.glob("*.[jp][pn]g"): file_new = file.with_stem(f"{file.stem}_加水印") img = Image.open(file).convert("RGBA") watermark = Image.new("RGBA", img.size, (255, 255, 255, 0)) draw = ImageDraw.Draw(watermark) bbox = draw.textbbox((0,0),text,font=font) w,h = bbox[2] - bbox[0] ,bbox[3] - bbox[1] draw.text(((img.width - w) / 2, (img.height - h) / 2), text, font=font, fill=color) watermark = watermark.rotate(angle, expand=0, fillcolor=(255, 255, 255, 0)) final = Image.alpha_composite(img, watermark).convert("RGB") final.save(file_new, quality=95) print(f"处理完成:{file}")
for file in folder.glob("*.[jp][pn]g")会筛选出所有后缀名为jpg、png的图片。
file_new = file.with_stem(f"{file.stem}_加水印"):新的文件名。with_stem会修改文章主名,file.stem会获取文件的主名,避免覆盖原图。
img = Image.open(file).convert("RGBA"):使用.open()打开图片,然后用.convert()把图片转化为RGBA格式。RGBA格式支持透明度调整,避免水印文字影响图片美观。
watermark = Image.new("RGBA", img.size, (255, 255, 255, 0)):创建一个和原图一样大小的透明画布,(255, 255, 255, 0)表示白色完全透明。
draw = ImageDraw.Draw(watermark):创建一个画笔。
bbox = draw.textbbox((0,0),text,font=font):计算出文字框的坐标位置。
w,h = bbox[2] - bbox[0] ,bbox[3] - bbox[1]:文字的宽度和高度。
(img.width - w) / 2:原图宽度减去文字宽度再除以2,就是文字水平居中的横坐标。
(img.height - h) / 2):文字垂直居中的纵坐标。
draw.text():在指定位置绘制水印文字, fill=color设置文字颜色和透明度。
watermark.rotate(angle):把水印画布旋转指定角度,expand=0表示旋转后画布的原来一样大,fillcolor设置旋转后空白处为透明。
Image.alpha_composite(img, watermark):合并原图和水印画布。
.convert("RGB"):转回RGB格式。
final.save(file_new, quality=95):保存新图片,quality=95表示保存图片的质量。
运行代码后,效果如下图所示:
怎么样,是不是很方便,你只需要对文件夹路径和水印文字相关内容进行设置,就能批量添加水印。下面是窗体化的运行小程序,你只需点点鼠标就能轻松搞定。
是不是比PS这些专业软件更简单?想“偷懒”的不妨学习一下吧。