如何给图片添加水印呢?在 Python 的世界里,有多种方法可以为图片添加水印。
其中一种方法,可以使用大名鼎鼎 Pillow 库,简简单单就能为图片加上水印。或简单的文字水印或 logo 图片水印都没问题,为了不影响观感,还能把水印设置为半透明的效果。
对于版权保护,还能给图片添加隐形的水印,即盲水印,又称隐水印。给图片加盲水印的 Python 库,有来自国内的阿里巴巴安全团队开发的 blind_watermark 库。盲水印的好处是图片有水印但人眼看不出来,需要通过程序才能提取水印,相当于隐形“盖章”,可以用在数据泄露溯源、版权保护等场景。
以下,分别使用两种方法为图片添加水印,一种是使用 Pillow 库,一种是使用 blind_watermark 库,如果你需要版权保护,可添加盲水印。其中,方法一原图如下,是一位漂亮的小姐姐:
关于 Pillow 库,在我早前的 CSDN 文章 《Python 实现 GIF 动态图片分解 , 多帧动态图分解成多张静态图片》 中有过简单的介绍,安装使用起来都非常简单,也没什么需要避坑的,所以就不再多作介绍了,直接开始。简单地,我们需要导入 Pillow 库中的 “Image”
, “ImageDraw”
和 “ImageFont”
三个模块即可实现为图片添加半透明的水印。以下是简单的 Demo 参考代码,真正应用还需再调整优化,完善完善,使其更 Pythonic 。
from PIL import Image, ImageDraw, ImageFont
def create_watermark():
with Image.open("girl_362.png").convert("RGBA") as base:
txt = Image.new("RGBA", base.size, (255,255,255,0))
fnt = ImageFont.truetype("SIMLI.TTF", 40)
d = ImageDraw.Draw(txt)
d.text((10,10), "水印", font=fnt, fill=(255,255,255,128))
out = Image.alpha_composite(base, txt)
out.show()
if __name__=='__main__':
create_watermark()
最终效果如下图所示,注意左上角:
blind_watermark 库的使用也非常简单,首先是安装,然后就是嵌入水印和提取水印。
使用 pip
安装 blind_watermark 库:
pip install blind-watermark
如果在使用 blind_watermark 时出现错误,错误信息为:ModuleNotFoundError: No module named 'pywt'
,那么需要把 pywt 也安装上:
pip install PyWavelets
待嵌入的水印,可以是一个 logo 图片,或是一个二维码图片,当然也支持嵌入字符串,甚至,隐水印还可以是二进制数据,以下以嵌入图片为例子。
代码:
from blind_watermark import WaterMark
bwm1 = WaterMark(password_wm=1, password_img=1)
bwm1.read_img('girl_unsplash.jpg')
bwm1.read_wm('logo.png')
bwm1.embed('girl_362_logo.png')
运行效果如下:
嵌入水印后的图片,和上面原图“完全一样”吧,人眼根本无法看得出来:
提取出来的水印就不贴出来了,有兴趣可自行运行代码试试。其实是一个二维码,这是由谷歌 Chrome 浏览器生成的,谷歌 Chrome 浏览器自 88 版本后,推出了二维码共享网页功能,我把我自己的 Demo 个人网站生成的二维码作为水印嵌入到了原图中,提取出来后扫码即可访问。
bwm1 = WaterMark(password_wm=1, password_img=1)
bwm1.extract(filename='girl_362_logo.png', wm_shape=(120, 120), out_wm_name='watermark.png', )