xxxxxxxxxx
63
1
def add_text_to_image(image, left_text, center_text, rigth_text):
2
'''
3
圖片添加水印,思路是連原圖總共分為3層圖片,第二層與原圖尺寸相同,將水印圖片塊粘貼到第二層后,再將第一層、第二層復合為一個新的image
4
:param image: Image.open()的文件內容
5
:param left_text: 左下文字
6
:param center_text: 中下文字
7
:param rigth_text: 右下文字
8
:return: 帶水印的image
9
'''
10
white_font = (255, 255, 255, 180)
11
black_bg = (0, 0, 0, 30)
12
font = ImageFont.truetype(os.path.join(BASE_DIR, 'static/font/STHeiti-Light.ttc'), size=44, index=0)
13
# 將原圖轉換為rgba模式
14
rgba_image = image.convert('RGBA')
15
# 創建水印層
16
text_overlay = Image.new('RGBA', (rgba_image.size[0], 50), black_bg)
17
# 創建復合背景層
18
layer = Image.new('RGBA', rgba_image.size, (255, 255, 255, 0))
19
# 水印層添加文字
20
image_draw = ImageDraw.Draw(text_overlay)
21
# 设置文本文字位置
22
text_size_x, text_size_y = image_draw.textsize(rigth_text, font=font)
23
text_xy_left = (0, (text_overlay.size[1] - text_size_y) / 2) # 底部左
24
text_xy_center = ((text_overlay.size[0] - text_size_x) / 2, (text_overlay.size[1] - text_size_y) / 2) # 底部中
25
text_xy_right = (text_overlay.size[0] - text_size_x, (text_overlay.size[1] - text_size_y) / 2) # 底部右
26
# 设置文本颜色和透明度
27
image_draw.text(text_xy_left, left_text, font=font, fill=white_font)
28
image_draw.text(text_xy_center, center_text, font=font, fill=white_font)
29
image_draw.text(text_xy_right, rigth_text, font=font, fill=white_font)
30
# 粘貼水印層到復合背景層
31
layer.paste(text_overlay, (0, layer.size[1] - text_overlay.size[1]))
32
# 復合圖片
33
image_with_text = Image.alpha_composite(rgba_image, layer)
34
return image_with_text
35
36
37
route('/mtr/upload/img', type='http', auth='none', csrf=False, cors='*') .
38
def upload_img(self, **kwargs):
39
'''
40
圖片上傳
41
:param kwargs: file或者base64為key,有file時傳的文件類型,base64時傳的文件的base64數據
42
:return:
43
'''
44
if kwargs.get('file', None) is not None:
45
file = kwargs['file']
46
filename = file.filename
47
now_time = dt.datetime.strftime(dt.datetime.now(), '%Y-%m-%d')
48
name = request.env.user.name or ''
49
# 添加水印
50
image = add_text_to_image(Image.open(file), now_time, name)
51
file_content = base64.b64encode(image.tobytes())
52
else:
53
file = json.loads(kwargs['base64'])
54
file_content = file['data']
55
filename = file['name']
56
file_record = request.env['maintenance_plan.binary.file'].sudo().create({
57
'file': file_content,
58
'filename': filename
59
})
60
url = '/web/content?model={}&id={}&field={}&filename_field={}'.format(
61
'maintenance_plan.binary.file', file_record.id, 'file', 'filename'
62
)
63
return to_json({'errcode': 0, 'msg': '', 'data': {'url': url}})
已复制