利用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