最近遇到有需要使用證件的情況,但是直接發送證件照片可能存在安全風險,所以考慮在手機上找個軟件給證件添加水印(滿屏水印那種,不是單個水印)。但是在應用商店下了幾個軟件,有可以使用的但是非VIP用戶有次數限制,很是煩人。
所有決定自己用Python的PIL庫搞一個小腳本處理它,同時證件照片在自己本地處理也比較放心,不用擔心照片被app上傳到服務器的風險。
需要安裝依賴:pip install pillow argparse
import sys
import argparse
from PIL import Image, ImageDraw, ImageFont, ImageEnhance
def read_origin_photo(photo_path):
origin_photo = Image.open(photo_path)
origin_photo = origin_photo.convert('RGBA')
h, w = origin_photo.size
return origin_photo, h, w
# def get_color(text_color):
# r = int(text_color[1:3], base=16)
# g = int(text_color[3:5], base=16)
# b = int(text_color[5:7], base=16)
# return r, g, b
def make_text_picture(h, w, text, font_path, font_size=40, angle=-45, color=(0, 0, 0)):
# 制作水印圖片
text_pic = Image.new('RGBA', (4 * h, 4 * w), (255, 255, 255, 255))
fnt = ImageFont.truetype(font_path, size=font_size)
text_d = ImageDraw.Draw(text_pic)
# a, b 分別控制水印的列間距和行間距,默認為字體的2倍列距,4倍行距
a, b = 2, 4
for x in range(10, text_pic.size[0] - 10, a * font_size * len(text)):
for y in range(10, text_pic.size[1] - 10, b * font_size):
text_d.multiline_text((x, y), text, fill=color, font=fnt)
# 旋轉水印
text_pic = text_pic.rotate(angle)
# 截取水印部分圖片
text_pic = text_pic.crop((h, w, 3 * h, 3 * w))
# text_pic.show()
return text_pic
def combine(origin_photo, text_pic, alpha=0.2, out_name='out.jpg'):
# 合並水印圖片和原圖
text_pic = text_pic.resize(origin_photo.size)
out = Image.blend(origin_photo, text_pic, alpha)
out = out.convert('RGB')
# 增強圖片對比度
enhance = ImageEnhance.Contrast(out)
out = enhance.enhance(1.0 / (1 - alpha))
out.save(out_name)
out.show()
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('photo_path', help='圖片路徑,如:1.jpg或./images/1.jpg')
parser.add_argument('text', help="要添加的水印內容")
parser.add_argument('--font_path', dest='font_path', default=r"C:\\Windows\\Fonts\\STSONG.TTF",
help='要使用的字體路徑,如 STSONG.TTF,windows可在C:\Windows\Fonts查找字體')
parser.add_argument('--new_image_name', dest='new_image_name', default='out_with_text.jpg',
help='輸出圖片的名稱, 默認out_with_text.jpg')
parser.add_argument('--text_angle', dest='text_angle', default=-45,
help='水印的旋轉角度,0為水平,-90位從上向下垂直, 90為從下向上垂直,默認-45')
parser.add_argument('--text_color', dest='text_color', default='#000000',
help="水印顏色,默認#000000(黑色)")
parser.add_argument('--text_size', dest='text_size',
default=40, help='水印字體的大小, 默認40')
parser.add_argument('--text_alpha', dest='text_alpha',
default=0.2, help='水印的不透明度,建議0.2~0.3,默認0.2')
args = parser.parse_args()
photo_path = args.photo_path
text = args.text
if not photo_path or not text:
print('必須指定圖片路徑和水印文字')
sys.exit(-1)
font_path = args.font_path
# text_color = get_color(args.text_color)
origin_photo, h, w = read_origin_photo(photo_path)
text_pic = make_text_picture(h, w, text, font_path,
font_size=args.text_size, angle=args.text_angle, color=args.text_color)
combine(origin_photo, text_pic, alpha=args.text_alpha,
out_name=args.new_image_name)
可以通過python add_text.py --help
命令查看幫助文檔,其中add_text.py
是腳本的名稱,可以按自己喜好更換。
在windows環境下測試使用,字體文件可以從windows字體庫中選擇,位置為C:\Windows\Fonts
。
D:\code>python add_text.py --help
usage: add_text.py [-h] [--font_path FONT_PATH] [--new_image_name NEW_IMAGE_NAME] [--text_angle TEXT_ANGLE]
[--text_color TEXT_COLOR] [--text_size TEXT_SIZE] [--text_alpha TEXT_ALPHA]
photo_path text
positional arguments:
photo_path 圖片路徑,如:1.jpg或./images/1.jpg
text 要添加的水印內容
options:
-h, --help show this help message and exit
--font_path FONT_PATH
要使用的字體路徑,如 STSONG.TTF,windows可在C:\Windows\Fonts查找字體
--new_image_name NEW_IMAGE_NAME
輸出圖片的名稱, 默認out_with_text.jpg
--text_angle TEXT_ANGLE
水印的旋轉角度,0為水平,-90位從上向下垂直, 90為從下向上垂直,默認-45
--text_color TEXT_COLOR
水印顏色,默認#FFFFFF(黑色)
--text_size TEXT_SIZE
水印字體的大小, 默認40
--text_alpha TEXT_ALPHA
水印的不透明度,建議0.2~0.3,默認0.2
原圖:
添加水印:python add_text.py 1.jpg "房東的貓"
結果顯示圖片的對比度會出現下降。不過放在證件上問題不大。
更換字體和顏色:python add_text.py --new_image_name="out2.jpg" --text_color="#0000FF" --font_path="簡卡通.TTF" 2.jpg "寄 沒有地址的信"
1. If the following error occu
The whole project includes: op