写在前面的话:
首先向各位粉丝宝宝道个歉。EICCIE升级大纲的同时,也革新掉了原有大纲中40%的内容,也就意味着同样作为技术爱好者的我,需要学习40%的新增技能。
这段时间一直在忙着学习新的技术,掌握新的技能。
园区网SDN、广域网SDN、云、数据中心、鸿蒙、java、大数据、数据存储、python、网络可编程及自动化,这些可爱的玩意儿让我废寝忘食,并且忘记了你们,对不起了。
今天主动分享一个实用脚本,以表诚意。
批量给图片加水印的python脚本
本脚本由达叔编写,主要用于日常工作及分享的目的。
时间不多,也没有做优化,凑合用用,好在处理的是不着急的事情。
借用了一个开源的第三方库,实现批量读取图片,然后加水印,然后保存的效果。
如果要使用加水印脚本,您需要自行在python解析环境中安装脚本中所使用的第三方库。
导入安装好的第三方库
import os
from PIL import Image, ImageDraw, ImageFont
定义一个加水印的函数
#定义函数用于添加水印,font为字体文件,image为通过Image.open()方法打开的图片对象,text为水印字符串
def AddWaterMark(font, image, text):
# 打开字体文件,自备一个字体文件
Font = ImageFont.truetype(font, 24)
# 添加背景
new_img = Image.new('RGBA', (image.size[0] * 3, image.size[1] * 3), (0, 0, 0, 0))
new_img.paste(image, image.size)
# 添加水印
font_len = len(text)
# 将图像转化为RGBA图像
rgba_image = new_img.convert('RGBA')
# 生成和待添加水印图片一样大的图片
text_overlay = Image.new('RGBA', rgba_image.size, (255, 255, 255, 0))
# 画图
image_draw = ImageDraw.Draw(text_overlay)
# 绘制多个水印,设置水印的位置
for i in range(0, rgba_image.size[0], font_len * 20):
for j in range(0, rgba_image.size[1], 50):
# 设置文本颜色和透明度和位置
image_draw.text((i, j), text, font=Font, fill=(255, 102, 102, 80))
# 水印方向设置
text_overlay = text_overlay.rotate(20)
# 将生成的图片覆盖到待添加水印的图片上
image_with_text = Image.alpha_composite(rgba_image, text_overlay)
# 裁切图片
image_with_text = image_with_text.crop((image.size[0], image.size[1], image.size[0] * 2, image.size[1] * 2))
return image_with_text
定义一个获取文件对象的函数
#定义函数,获取当前目录及子目录下的所有文件
def GetAllPngs(PngPath, All_IMG_NameList):
CurrentList = os.listdir(PngPath) #读取当前目录下所有对象形成列表
for obj in CurrentList: #遍历列表
Current_path = os.path.join(PngPath,obj) #将所有对象形成绝对路径
if os.path.isdir(Current_path): #如果是目录则执行自我迭代
GetAllPngs(Current_path, All_IMG_NameList) #检查是否有子目录
elif os.path.isfile(Current_path):
All_IMG_NameList.append(Current_path) #返回绝对路径和文件名
else:
pass
return All_IMG_NameList
定义实参并调用函数完成工作
if __name__ == '__main__':
font = 'd:/mingliu.ttc' #字体文件目录
text = '乾颐堂达叔出品 www.qytang.com' #要添加的水印文本()
PngPath = 'D:/temp/' #生成的Png图片目录
AllPngNameList = [] #用于存储处理前图片绝对路径
GetAllPngs(PngPath, AllPngNameList) #获取处理前图片绝对路径列表
#使用for循环遍历列表,将每个图片都加上水印并保存
for IMG in AllPngNameList:
image = Image.open(IMG)
MarkedPng = AddWaterMark(font , image, text)
Result = IMG.replace('jpg', 'png')
MarkedPng.save(Result)