algN/vodsdk/test/水印/视频添加文字水印3.py

114 lines
3.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import cv2
from PIL import Image, ImageDraw, ImageFont
#################################
# 给图片加上水印
#################################
class Water:
def __init__(self):
# 颜色对应http://www.yuangongju.com/color
self.color_dict = {
'white':(255,255,255,255),
'black':(0,0,0,255),
'gray':(205,201,201,255),
'red':(255,0,0,255),
'yellow':(255,215,0,255),
'blue':(0,0,170,255),
'purple':(205,105,201,255),
'green':(0,205,0,255)
}
self.position_list = [1,2,3,4]
def one_water(self, image, text, position=1, fontsize=20, fontcolor='black'):
"""
普通照片水印
params:
image:图片
text:水印文字
position:水印位置
1左上
2右上
3右下
4左下
fontsize:字体大小
fontcolor:字体颜色
[white, black, gray, red, yellow, blue, purple, green]
"""
if position not in self.position_list:
position = 1
h, w = image.size[:2]
keys = self.color_dict.keys()
if fontcolor not in keys:
fontcolor = 'black'
color = self.color_dict[fontcolor]
fnt = ImageFont.truetype('../font/simsun.ttc', fontsize)
im = image.convert('RGBA')
mask = Image.new('RGBA', im.size, (0,0,0,0))
d = ImageDraw.Draw(mask)
size_h, size_w = d.textsize(text, font=fnt)
alpha = 5
if position == 1:
weizhi = (0 + alpha, 0 + alpha)
elif position == 2:
weizhi = (h - size_h - alpha, 0 + alpha)
elif position == 3:
weizhi = (h - size_h - alpha, w - size_w - alpha)
else:
weizhi = (0 + alpha, w - size_w - alpha)
# position 为左上角位置
d.text(weizhi, text, font=fnt, fill=color)
out = Image.alpha_composite(im, mask)
return out
def fill_water(self, image, text, fontsize):
"""
半透明水印布满整张图并且自动旋转45°
params:
image:图片
text:文字
fontsize:文字大小
"""
font = ImageFont.truetype('../font/simsun.ttc', fontsize)
# 添加背景
new_img = Image.new('RGBA', (image.size[0] * 3, image.size[1] * 3), (255, 255, 255, 255))
new_img.paste(image, image.size)
# 添加水印
font_len = len(text)
rgba_image = new_img.convert('RGBA')
text_overlay = Image.new('RGBA', rgba_image.size, (0, 0, 0, 0))
image_draw = ImageDraw.Draw(text_overlay)
for i in range(0, rgba_image.size[0], font_len*40+100):
for j in range(0, rgba_image.size[1], 200):
# print(f'i:{i}, j:{j}, text:{text}, font:{font}')
image_draw.text((i, j), text, font=font, fill=(0, 0, 0, 50))
text_overlay = text_overlay.rotate(-45)
image_with_text = Image.alpha_composite(rgba_image, text_overlay)
image_with_text = image_with_text.crop((image.size[0], image.size[1], image.size[0] * 2, image.size[1] * 2))
return image_with_text
if __name__ == '__main__':
img = Image.open("../a.jpg")
fontcolor = 'yellow'
water = Water()
text = "hello world"
fill_img = water.fill_water(img, text, fontsize=36)
# 一定要保存为png格式
fill_img.save(u'aa.png')
print('finish')