在做一些工作的时候,有时候会涉及到给图片加上水印,这个如果手动添加的话,效率太低了,通常选择代码完成。下面这个是给图像添加文字水印(图片水印还在研究中)
比如,在下面的图片中添加 “美团外卖” 水印
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
from PIL import Image,ImageDraw,ImageFont import numpy as np import random import cv2 import re ################################################################################### class Make_Font( object ): #### 设置文字水印 def __init__( self ,image_path,out_path,font,font_size,diaphaneity): self .image_path = image_path ### 读入背景图片 self .out_path = out_path ### 输出水印图片 self .font = font ### 设置水印字内容 self .font_size = font_size ## 设置字体大小 self .diaphaneity = diaphaneity ### 设置字体透明度 suffix = self .out_path.split( '.' )[ - 1 ] match = re.match(r 'png' ,suffix) if not match: raise ValueError( 'The out put file name must be PNG file!' ) def _text_xy( self ,image_size): width, height = image_size x = random.randint( min ( 0 , width), max ( 0 , width)) #### 随机取画文字点 y = random.randint( min ( 0 , height), max ( 0 , height)) return x,y def _draw_font_box( self ,image_size,font_size): img_w,img_h = image_size font_w,font_h = font_size all_x = [] x = 0 all_x.append(x) while x < img_w: x = font_w + 50 + x #### 隔50 画一次文字 all_x.append(x) all_y = [] y = 0 all_y.append(y) while y < img_h: y = font_h + 50 + y #### 隔50 画一次文字 all_y.append(y) return all_x,all_y def run_make_font( self ): image = Image. open ( self .image_path) ## (598,419) image_x,image_y = image.size[ 0 : 2 ] ## (598,419) text = self .font text_diap = self .diaphaneity #### 设置字体透明度 越小越透明 (0,100) font = ImageFont.truetype( '1.ttf' , self .font_size) ## 设置字体和大小 layer = image.convert( 'RGBA' ) ## 转换图像格式:A为透明度 尺寸(598, 419) max_size = max (image_x,image_y) text_overlayer = Image.new( 'RGBA' ,( 2 * max_size, 2 * max_size),( 255 , 255 , 255 , 0 )) ## 生成同等大小的透明图片 image_draw = ImageDraw.Draw(text_overlayer) ## 画图 text_size_x,text_size_y = image_draw.textsize(text,font = font) ## 获取文本大小 #print(text_size_x,text_size_y) ### 字体大小 (250,50) x_count,y_count = self ._draw_font_box(text_overlayer.size,(text_size_x,text_size_y)) for i in x_count: for j in y_count: #text_x,text_y = text_xy((image_x,image_y)) ## 设置文本位置 image_draw.text(( int (i), int (j)),text,font = font,fill = ( 255 , 255 , 255 ,text_diap)) ## 设置文本颜色和透明度 text_overlayer = text_overlayer.rotate( 45 ) # 设置逆时针旋转45度 ####### 设置切割点 ############## box_x = (text_overlayer.size[ 0 ] - image_x) / 2 box_y = (text_overlayer.size[ 1 ] - image_y) / 2 box = [box_x,box_y,box_x + image_x,box_y + image_y] new_img = text_overlayer.crop(box) new_img = new_img.resize(layer.size) #text_overlayer.save('text_overlayer_after.png') ## 生成的水印png图片 #new_img.save('new_img.png') ## 生成的水印png图片 after = Image.alpha_composite(layer,new_img) ## (im1,im2)将im2复合到im1上,返回一个Image对象 after.save( self .out_path) ### .png 可以直接保存RGBA格式 ######################################################################################### if __name__ = = "__main__" : ############### 文字水印 ######################## MK = Make_Font(image_path = './without_water/test5.jpg' ,out_path = 'test5_after.png' ,font = '美团外卖' ,font_size = 30 ,diaphaneity = 90 ) MK.run_make_font() ################################################## |
这段代码主要完成的是,将特定的文字水印添加图像中,文字内容、文字尺寸、文字透明度都可以调节(image_path为原图像,out_path为输出的水印图像)
效果图如下:
注:上传图像的时候,图像进行了压缩。
本来准备再写一个生成图像Logo的水印的代码,可惜一直没达到自己预期。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/yueshitian/article/details/100775963