功能

使用知名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

代码

github: 2Dou/watermarker