图片加上文字浮水印
这篇文章会介绍使用 Python 的 Pillow 第三方函数库,实作图片加上文字的效果 ( 使用文字作为浮水印 ),最后还会搭配 glob 函数库,实现批次加浮水印的功能。
- 本篇使用的 Python 版本为 3.7.12,所有范例可使用 Google Colab 实作,不用安装任何软件 ( 参考:使用 Google Colab )
- 使用 Colab 操作需要连动 Google 云端硬盘,请参考:连动 Google Drive
安装 Pillow
输入下列指令安装 Pillow,根据个人环境使用 pip 或 pip3,如果使用 Colab 或 Anaconda Jupyter,已经内建 Pillow 函数库。
!pip install Pillow
取得文字字型文件
要在图片里加入文字,首先要知道“字型档”,字型档可以从电脑本机取得已经安装的字型,或前往 Google Font 下载免费的字型档,下载字型档后,放到指定的文件夹内,范例将字型与 Python 程序放在同一个目录下。
替图片加上文字
一开始先加载 Pillow 函数库的 Image、ImageFont 和 ImageDraw 模组,Image 负责处理图片的图像效果,ImageFont 负责读入字型,ImageDraw 负责在图片上绘制图案。
from PIL import Image, ImageFont, ImageDraw
接着使用 Image.open 打开要加文字的图片,使用 ImageFont.truetype 读取字型文件 ( 第一个参数为字型文件路径,第二个参数为字体大小 ),接着使用 ImageDraw.Draw 的 text 方法将文字画入图片中 ( 第一个参数为坐标、第二个参数为文字、第三个参数为 RGB 颜色、第四个参数为字型 )。
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks') # Colab 換路徑使用
from PIL import Image, ImageFont, ImageDraw
img = Image.open('./photo.jpg') # 開啟圖片
font = ImageFont.truetype('Teko-Regular.ttf', 100) # 設定字型
draw = ImageDraw.Draw(img) # 準備在圖片上繪圖
draw.text((0,0), 'OXXO.STUDIO', fill=(255,255,255), font=font) # 將文字畫入圖片
img.save('./ok.jpg') # 儲存圖片
# img.show() # Colab 不支援直接顯示,如果使用本機環境會開啟圖片檢視器
透过取得图片的长宽尺寸,就能够定义文字摆放的位置 ( 由于无法知道一段文字的总宽度,如果要靠右对齐,就要先尝试几张图,才能取得正确的位置 )。
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks') # Colab 換路徑使用
from PIL import Image, ImageFont, ImageDraw
img = Image.open('./photo.jpg')
w, h = img.size # 取得圖片尺寸
font = ImageFont.truetype('Teko-Regular.ttf', 100)
draw = ImageDraw.Draw(img)
draw.text((0,h-100), 'OXXO.STUDIO', fill=(255,255,255), font=font) # 使用 h-100 定位到下方
img.save('./ok.jpg')
旋转文字浮水印
因为无法直接旋转文字,如果要旋转文字浮水印,必须采用类似“logo 浮水印”的做法,先使用 Image.new 产生一张空白的图片 ( mode 设定为 RGBA,color 设定四个参数为 0,表示透明背景 ),接着将文字绘制在这张空白图片上,旋转有文字的图片,再将图片贴到原本的图片上,就会出现旋转文字的浮水印。
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks') # Colab 換路徑使用
from PIL import Image, ImageFont, ImageDraw
img = Image.open('./photo.jpg')
font = ImageFont.truetype('Teko-Regular.ttf', 150)
# 設定一張空白圖片,背景 (0,0,0,0) 表示透明背景
text = Image.new(mode='RGBA', size=(600, 150), color=(0, 0, 0, 0))
draw = ImageDraw.Draw(text)
draw.text((0, 0), 'OXXO.STUDIO', fill=(255, 255, 255), font=font) # 畫入文字
text = text.rotate(30, expand=1) # 旋轉這張圖片,expand 設定 1 表示展開旋轉,不要裁切
img.paste(text, (50, 0), text) # 將文字的圖片貼上原本的圖
img.save('./ok.jpg')
调整文字浮水印透明度
由于 PIL 里调整透明度的 putalpha 方法,会调整 RGBA 里的 A ( alpha ) 色版数值,如果作为浮水印本身是去背的图片,会造成去背的部分也受到影响 ( 因为去背位置的像素包含了 alpha 信息 ),因此如果要做到半透明的浮水印,可以先产生一张完全不透明的图 ( 有浮水印的 ),然后再调整这张图的透明度,与原本没有浮水印的图结合,就会产生半透明的浮水印效果。
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks') # Colab 換路徑使用
from PIL import Image, ImageFont, ImageDraw
# import os
img = Image.open('./photo.jpg')
w, h = img.size
font = ImageFont.truetype('Teko-Regular.ttf', 150)
text = Image.new(mode='RGBA', size=(600, 150), color=(0, 0, 0, 0))
draw = ImageDraw.Draw(text)
draw.text((0, 0), 'OXXO.STUDIO', fill=(255, 255, 255), font=font)
text = text.rotate(30, expand=1)
img2 = Image.open('./photo.jpg') # 再次開啟原本的圖為 img2
img2.paste(text, (50, 0), text) # 將文字貼上 img2
img2.convert('RGBA') # 圖片轉換為 RGBA 模式 ( 才能調整 alpha 色版 )
img2.putalpha(100) # 調整透明度,範圍 0~255,0 為全透明
img.paste(img2, (0, 0), img2) # 將 img2 貼上 img
img.save('./ok.jpg')
搭配 glob,批次加浮水印
了解加入浮水印的方法后,使用 glob 标准函数库读取 demo 文件夹里所有的 jpg 文件,就能批次加入浮水印。
- 参考:for 循环、拆分字串 split
- 图片来源:爬取并自动下载 PTT 正妹图片
from PIL import Image, ImageFont, ImageDraw
# import os
# os.chdir('/content/drive/MyDrive/Colab Notebooks') # Colab 換路徑使用
imgs = glob.glob('./demo/*.jpg') # 讀取 demo 資料夾裡所有的圖片
for i in imgs:
name = i.split('/')[::-1][0] # 取得圖片名稱
img = Image.open(i) # 開啟圖片
w, h = img.size
font = ImageFont.truetype('Teko-Regular.ttf', 100)
text = Image.new(mode='RGBA', size=(400, 100), color=(0, 0, 0, 0))
draw = ImageDraw.Draw(text)
draw.text((0, 0), 'OXXO.STUDIO', fill=(255, 255, 255), font=font)
text = text.rotate(30, expand=1)
img2 = Image.open(i)
img2.paste(text, (50, 0), text)
img2.convert('RGBA')
img2.putalpha(150)
img.paste(img2, (0, 0), img2)
img.save(f'./test/{name}')
小结
其实加浮水印的原理都大同小异,不外乎就是将“两张图片重叠”,透过程序的方式,就能够一次将浮水印加入大量的图片,省去不少人工作业的时间。
微信扫码关注
抖音扫码关注