图片添加半透明文字水印 Python
效果
python marker.py -f ./input/test.png -m '添加水印'

功能
使用知名python图片处理库PIL,为图片添加文字水印。
实现
步骤:根据文字生成水印图片;将水印图半透明并覆盖在原图上。
1. 将文字转换成水印图片
def gen_mark(args): # 字体宽度 length = len(args.mark) * args.size # 创建水印图片(宽度、高度) mark = Image.new(mode='RGBA', size=(length, args.size)) # 生成文字 draw = ImageDraw.Draw(im=mark) draw.text(xy=(0, 0), text=args.mark, # 水印文字 fill=args.color, # 文字颜色 '#008B8B' font=ImageFont.truetype(TTF_FONT, # 文字字体 size=args.size)) # font_size 文字大小 del draw # 裁剪图片边缘空白区域 bg = Image.new(mode='RGBA', size=mark.size) diff = ImageChops.difference(mark, bg) del bg bbox = diff.getbbox() if bbox: mark = mark.crop(bbox) # 设置水印透明度 set_opacity(mark, args.opacity) # 得到水印文字大小 print(mark.size) 此处省略...
2. 将水印图片覆盖在原图上
def mark_im(im): ''' 在im图片上添加水印 im为打开的原图''' # 计算斜边长度 c = int(math.sqrt(im.size[0]*im.size[0] + im.size[1]*im.size[1])) # 以斜边长度为宽高创建大图(旋转后大图才足以覆盖原图) mark2 = Image.new(mode='RGBA', size=(c, c)) # 在大图上生成水印文字,此处mark为上面生成的水印图片 y, idx = 0, 0 while y < c: # 制造x坐标错位 x = -int((mark.size[0] + args.space)*0.5*idx) idx = (idx + 1) % 2 while x < c: # 在该位置粘贴mark水印图片 mark2.paste(mark, (x, y)) x = x + mark.size[0] + args.space y = y + mark.size[1] + args.space # 将大图旋转一定角度 mark2 = mark2.rotate(args.angle) # 在原图上添加大图水印 if im.mode != 'RGBA': im = im.convert('RGBA') im.paste(mark2, # 大图 (int((im.size[0]-c)/2), int((im.size[1]-c)/2)), # 坐标 mask=mark2.split()[3]) del mark2 return im

浙公网安备 33010602011771号