首页 >> Python >> 内容页

用PIL(pillow)为图片打半透明水印

利用PIL打水印的过程

1.将水印图片转RGBA模式,并设置透明度。如果是打文字水印,利用ImageDraw写出文字图片,RGBA模式。按需求设置图片长宽。
2.将原图转RGBA模式,获取长宽, 计算打水印的位置。
3.用Image的 alpha_composite 函数,整合两张 RGBA图片。

PIL打半透明水印代码

def water_mark_image(img:Image.Image) -> Image.Image:
    watermark_text = "水印文字"
    # 获取原图长宽
    img_width, img_height = img.size
    # 写出文字水印图片
    draw = ImageDraw.Draw(img)
    font = ImageFont.truetype("font.ttf", 28)
    # 获取水印图片长宽
    text_width, text_height = draw.textsize(watermark_text, font)
    # 将原图转RGBA
    rgba_img = img.convert("RGBA")
    # 如果原图太小则不打水印 (水印图片最多占原图的 1/3)
    if img_width < (text_width*3) or img_height < (text_height*3) :
        return False

    # 将文字水印图片转RGBA new最后的参数元组 150为透明度 大概55%
    watermark_im = Image.new('RGBA', (text_width + 20, text_height + 20), (255, 255, 255, 150))
    # 将文字写到水印图片上
    watermark_draw = ImageDraw.Draw(watermark_im)
    watermark_draw.text((10, 10), watermark_text, font=font, fill=(0,0,0,50))
    # 设置一个边距
    margin = 20
    # 打水印的位置 (右下角 + 边距)
    pos_x = img_width - text_width - margin
    pos_y = img_height - text_height - margin

    #整合两张图片
    rgba_img.alpha_composite(watermark_im, (pos_x, pos_y))
    #最后将原图片转换RGB模式就是一张带有半透明水印的图片 PNG可以直接保存不转RGB,jpg则需要转
    img = rgba_img.convert("RGB")
    return img
PIL