114 lines
3.5 KiB
Python
114 lines
3.5 KiB
Python
|
|
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')
|