使用Python为图片添加水印

基本思路就是在图片上进行绘制

使用 pillow . the friendly PIL fork. PIL is the Python Imaging Library.

安装

python3 -m pip install pillow

应用

我们使用此库中的三个类来完成水印工作:

  • Image 图片对象,用于加载待处理的图片
  • ImageDraw 图像绘制工具,用于在图片对象上绘制内容
  • ImageFont 字体对象,绘制文字过程中需要指定字体

实践

假设,我们要对一张名为 “input.png” 的图片添加 粉色的 “仿冒必究” 字样的水印,将处理后的图片输出为 “output.png”。

代码如下:

from PIL import Image, ImageDraw, ImageFont

img = Image.open("input.png") # 打开图片
# font = ImageFont.truetype("simsun.ttc",24) # 加载指定字体
font = ImageFont.load_default() # 加载默认字体(默认字体一般不支持中文)
a = ImageDraw.Draw(img) # 创建绘制工具
a.text((0,0),"仿冒必究","pink",font) # 绘制文本
img.save("output.png", format="png") # 输出图片
  • ImageFont.load_default() 可以获得默认字体,但通常不支持中文
  • ImageFont.truetype("simsun.ttc",24) 可以指定字体文件和字体尺寸(文件自己找)
  • ImageDraw.text 参数分别是:绘制位置(元组)、绘制的文本内容、字体颜色,字体对象

补充

图片来源

上述代码里,图片来源于 文件,我们使用了 open 函数打开文件,而 open 函数的定义如下:

open(fp, mode='r') -> None

其中参数 fp 的解释是:

param fp: A filename (string), pathlib.Path object or a file object.
The file object must implement ~file.read, ~file.seek, and ~file.tell methods, and be opened in binary mode.

就是说,参数可以是个路径,也可以是个文件对象,即 内置函数 open 的返回值。

但是在一些情景下,我们接收到的是一张图片读到内存中的 bytes 对象,而非文件本身。
此时,我们可以使用 io 库中的 io.BytesIO , 此对象可以理解为一个文件对象(或者叫内存文件)。

例如:

import io
from PIL import Image

data = bytes() # 假设这个是我们收到的图片的 bytes 对象
fp = io.BytesIO(data) # 通过 io.BytesIO 创建文件对象
img = Image.open(fp) # 打开此图片
...

字体颜色

上面代码中我使用的颜色是 “pink” 粉色。实际上颜色既可以使用其名称(支持常用的HTML颜色名),也可以使用 (R,G,B) 元组 或者 (R,G,B,A) 元组,具体请参考:ImageColor

发表评论

%d 博主赞过: