Pillow介绍

PIL(Python Imaging Library)是Python图像处理标准库,但只支持Python2.7;Pillow是在其基础增加了兼容性和其他新特性,支持最新Pytho3.x。进行图像处理时,可以直接安装Pillow,就能使用PIL和Pillow中的API。

打水印方法

预期效果

打水印前

Dogecoin

打水印后

Dogecoin1

方法

创建一个和底图相等大小的画布,透明度设置为0,在画布上添加水印的文字并调整好位置,叠加到底图上。

注意事项

  • 在批量添加水印的过程中,由于底图大小不一,所以水印文字的大小应该由底图大小来动态决定
  • 由于水印的文字大小是动态的,水印位置如果设置成绝对位置,会出现吞字情况,所以水印的位置也应该设置成动态的。

示例代码

  • PIL.Image.new(mode,size,color): 创建新图像。mode:图像的模式(RGB/RGBA),size图像大小,color初始化图像底色。

  • PIL.Image.alpha_composite(img1,img2): 将img2复合到img1上,相当于图层叠加。img1必须是RGBA模式,img2也必须是RGBA模式且和img1相同大小。

  • PIL.ImageDraw.Draw(img): 创建对象绘制img,相当于栅格化。

  • PIL.ImageFont.truetype(font=None, size=10, index=0, encoding=’’, layout_engine=None): 创建字体对象。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from PIL import Image,ImageFont,ImageDraw
import os
output_base_path = "" # 输出文件夹
input_dir = "" # 底图文件夹
content = "" #水印内容
font_type = "" #水印字体 win10字体在C:\Windows\Fonts目录下(e.g.C:\\Windows\\Fonts\\simsun.ttc)

def add_watermark(file_path):
img = Image.open(file_path).convert('RGBA')
watermark = Image.new('RGBA',img.size,(0,0,0,0))
#参考别人做法,根据底图大小按比例调整水印大小
font_size = 0
if img.size[0]>img.size[1]:
font_size = int(img.size[1]/100*3.5)
else:
font_size = int(img.size[0]/100*3.5)
fnt = ImageFont.truetype(font_type,font_size)
d = ImageDraw.Draw(watermark)
#水印位置动态调整,根据水印文字数量调整水印位置
d.text((watermark.size[0]-(len(content)+2)*font_size,watermark.size[1]-1.5*font_size),content,font =fnt,fill=(255,255,255,255))
out = Image.alpha_composite(img,watermark)
file_name = os.path.basename(file_path).split('.')[0]
out.save(os.path.join(output_base_path,file_name+".png"))

if __name__ =="__main__":
for files in os.listdir(input_dir):
add_watermark(os.path.join(input_dir,files))
print('finished')

参考文章