python实现为图片批量添加水印
参考:
使用 Python 给图片添加水印,其中一种还是隐形的盲水印呢! - 知乎 (zhihu.com)
python通过对话框实现文件或文件夹路径的选择并获得路径_请选择的博客-CSDN博客_python选择文件夹或文件
[python] OSError: cannot write mode RGBA as JPEG - 黄天星 - 博客园 (cnblogs.com)
需求:
课程报告截图得带信息水印,因为觉得截图时添加文字麻烦,下载图片处理软件占空间,在线处理老付费,索性写个脚本
魔改:
结合tkinter可以直接调出文件选择框,通过计算输入文字和图片大小,大致确定合适添加水印位置
可以修改fnt里的字体:调用C:Program FilesMicrosoft OfficerootvfsFontsprivate下的文件即可
可以修改d.text中fill水印颜色:在线调色网址ColorSpace - Color Palettes Generator and Color Gradient Tool (mycolor.space)
from PIL import Image, ImageDraw, ImageFont
import tkinter as tk
from tkinter import filedialog
import numpy as np
import time
def create_watermark():
print('请选择要添加水印的图片:')
time.sleep(1)
files_path = get_files_path()
if files_path is None:
return
else:
for i in files_path:
print(i)
text = input('请输入要添加的水印文字:')
for i in files_path:
img = Image.open(i)
# 获取图片大小以计算水印大致位置
arr_img = np.asarray(img)
x, y = arr_img.shape[1], arr_img.shape[0] # 长和宽
fnt_size = round(x / 2 / len(text)) # 文字大小
if fnt_size < 20:
fnt_size = 20
txt_x = x / 2 - fnt_size * len(text) / 2 # 文字开始的x坐标
txt_y = y / 2 - fnt_size / 2 # 文字开始的y坐标
# 开始添加水印
with img.convert("RGBA") as base: # 必须先转换成RGBA才能出现色彩
txt = Image.new("RGBA", base.size, (255, 255, 255, 0))
fnt = ImageFont.truetype("SIMLI.TTF", fnt_size)
d = ImageDraw.Draw(txt)
d.text((txt_x, txt_y), text, font=fnt, fill=(249, 12, 31))
new = Image.alpha_composite(base, txt) # 将水印和原图片合成
new.save(i)
print('添加水印完成!')
# 获取图片路径
def get_files_path():
root = tk.Tk()
root.withdraw()
filepath = filedialog.askopenfilenames()
return filepath
def run():
create_watermark()
if __name__ == '__main__':
run()
效果:
很可惜没能实现倾斜文字水印,就是常见的pdf里那种,因为如果采用PIL下rotate函数会导致文字偏移很难计算具体位置,索性就这样了,能够基本满足我做课程报告为截图批量添加水印的需求就好!