最近遇到有需要使用證件的情況,但是直接發送證件照片可能存在安全風險,所以考慮在手機上找個軟件給證件添加水印(滿屏水印那種,不是單個水印)。但是在應用商店下了幾個軟件,有可以使用的但是非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 "寄 沒有地址的信" 
Centos7 arm64 schema switching Python version causes Yum invalidation recovery method and reinstallation of Yum
1. If the following error occu
Python graduation design works based on django framework personal blog system completed finished product (7) mid-term inspection report
The whole project includes: op