前段时间因为工作原因需要给大量照片添加水印,且每个图片中的水印内容均不相同,尝试过ps的脚本,没研究出结果,后来使用python+PIL实现了想要的效果,这里作为新人分享以下
以下是代码,有能优化的地方希望大佬提出
[Python] 纯文本查看 复制代码 from PIL import Image, ImageDraw, ImageFont
import pandas as pd
# 一般水印为了增加可读性,需要设置阴影
def add_shadow(draw, text, font, xy, shadowcolor, shadow_offset):
draw.text((xy[0] + shadow_offset[0] // 2, xy[1] + shadow_offset[1] // 2), text, font=font, fill=shadowcolor)
draw.text(xy, text, font=font, fill="white")
# 读取包含水印信息的CSV文件,这里填写你存储水印内容的表格路径,表格标题分别是:图像文件名、水印内容1、水印内容2
df = pd.read_csv(r'C:\Users\admin\Desktop\photo\watermark.csv')
# 定义字体文件路径
font1_path = "C:/Windows/Fonts/Dengb.ttf"
font2_path = "C:/Windows/Fonts/Deng.ttf"
# 循环处理每一行数据,表格的标题依次为以下内容
for index, row in df.iterrows():
image_file = row['图像文件名']
watermark_text1 = row['水印内容1']
watermark_text2 = row['水印内容2']
# 打开原始图像
image = Image.open(f'C:/Users/admin/Desktop/photo/{image_file}')
width, height = image.size
# 根据图片的横纵向情况设置水印高度
if width > height:
text_height1 = 90 # 横向图片文字的起始高度
text_height2 = 100 # 横向图片第二行文字的间隔距离
else:
text_height1 = 95 # 纵向图片文字起始高度
text_height2 = 100 # 纵向图片第二行的间隔距离
# 添加水印
draw = ImageDraw.Draw(image)
# 设置文字大小
font1 = ImageFont.truetype(font1_path, 25)
font2 = ImageFont.truetype(font2_path, 80)
# 添加第一行水印及阴影
text_width1, _ = draw.textsize(watermark_text1, font1)
text_x1 = (width - text_width1) // 2
text_y1 = height - text_height1 - 0
add_shadow(draw, watermark_text1, font1, (text_x1, text_y1), "grey", (1, 1))
# 添加第二行水印及阴影
text_width2, _ = draw.textsize(watermark_text2, font2)
text_x2 = (width - text_width2) // 2
text_y2 = text_y1 - text_height2 - 0
add_shadow(draw, watermark_text2, font2, (text_x2, text_y2), "grey", (2, 2))
# 保存带水印的图像
image.save(f'C:/Users/admin/Desktop/photo/修改后/{image_file}')
print("水印添加完成!")
到这里就可以看到水印效果啦,效果不佳再进行代码调整
顺便再给个批量获取当前文件夹文件名的脚本
[PowerShell] 纯文本查看 复制代码 dir /b >files.txt
内容粘贴到文本文档改为bat放到照片目录运行就行了 |