Python实现图片添加水印(支持中文、英文和图片)
阅读大纲
- 图片水印忽大忽小问题研究
- 中文水印乱码问题
- 水印的动态展示
背景
在上次CSDN中发表技术文章的时候,文章中涉及到图片,CSDN会自动上传然后添加水印,突然注意到上传之后的图片的水印超级小
,就在右下角一丢丢点
,不注意还以为没有添加呢,然后对比这里之前文章的水印发现显示挺正常合适的。
为啥有时候显示的很适合,有时候显示的特别小呢?
然后去微信公账号的平台测试下了,同样的图片,微信公众号显示合适(比例、位置等看来正常,不是忽大忽小)
研究问题所在
之前用Python写过给图片添加水印的小工具,然后用该工具经常测试、验证问题所在。
经过使用不同尺寸和大小的图片测试和验证发现问题所在。出现在两个点上
1、水印举例图片边距是固定的,比如都是10px
2、文字水印没有设置字体或者设置了固定大小
针对第一个点,比如图片A尺寸 300px * 200px
,如果默认边距是10px。
下面这个是测试使用的Demo程序
1 | #!/usr/bin/env python |
通过调整原始图片的大小,然后展示最终的结果很容易发现问题,为了节约篇幅,把三次测试结果调整到一个截图中缩放到相同的尺寸,可以看到图片越大,水印(水印本身的大小没有发生变化)越来越小
同样的,如果设置了水印的字体,但是字体大小固定
,即使边距随之动态变化
,那么情况也和上面类似,只是水印的位置不固定了而已。
因为设置字体设计到 中文水印乱码
的问题,我们放到第二趴介绍。
同时这里思考一个问题,如何实现水印边距随之动态变化
?
中文水印乱码
中文水印乱码或者更正确的说是中文水印导致的报错
问题。
报错信息如下
原因就是未配置字体
导致的,至于为什么,可以查看pillow的源码中ImageFont.py
ImageFont 类中getmask方法中提示
1 | If the font uses antialiasing, the bitmap should have mode ``L`` |
我们修改最开始的Demo,添加如下代码
1 | # 定义字体 |
最终的完整Demo代码详见 testImageWatermark.py
水印的动态展示
水印的动态上面提到需要解决两个问题
1、水印距离原始图片的动态边距
2、水印字体大小的动态设定
为了解决动态设定
使之随图片尺寸而变化。最简单的就是通过百分比
来实现,取长或者宽的百分比。代码如下
1 | # 左右间距,采用图片比例的扩展,可以有效解决不同大小图片,水印位置相对一致 |
最终完善工具脚本支持
1、中文、英文 文字水印
2、图片水印
3、修复因为图片过大导致 文字水印超小的问题
4、解决中文水印乱码问题
5、支持添加到不同的位置,左上角、右上角、左下角、右下角、中心位置
6、支持设置水印颜色
最终完整脚本详见: python添加水印工具
或者 CSDN的资源下载
可以关注公众号,第一时间获取最新分享哦~
References
[1] testImageWatermark.py: https://gitee.com/colin5063/cws-tools/blob/master/python/testImageWatermark.py
[2] python添加水印工具: https://gitee.com/colin5063/cws-tools/blob/master/python/cws_image.py
Python实现图片添加水印(支持中文、英文和图片)
http://blog.colinspace.com/2021/12/23/Python实现图片添加水印(支持中文、英文和图片)/