玩命加载中...
# 利用python对图像加水印
有时候我们需要对自己的摄影作品或者制作的图像加上水印,大部分修图软件都可以做到水印功能,可是如何做到批量加水印呢?Python就可以做到。
本教程中,我们将学习如何利用python中的matplotlib模块读取图像、对图像添加水印以及存储图像。
以下代码中,我们将使用`matplotlib`,`skimage`以及`numpy`。
预计学习用时:20分钟。
本教程基于**Python 3.6**。
原创者:**SofaSofa TeamM** | 修改校对:SofaSofa TeamC |
----
### 0. 素材下载
我们使用了国内三个城市的风景照作为图像素材(下载[上海](http://sofasofa.io/tutorials/matplotlib_watermark/shanghai.jpg)、[深圳](http://sofasofa.io/tutorials/matplotlib_watermark/shenzhen.jpg)、[台北](http://sofasofa.io/tutorials/matplotlib_watermark/taibei.jpg))以及绿色沙发([下载](http://sofasofa.io/tutorials/matplotlib_watermark/sofasofa.png))作为水印素材。
### 1. 文字类型水印
我们很容易利用matplotlib中pyplot.text函数实现文字类型的水印。实现的代码如下:
```python
import matplotlib.pyplot as plt
def TextWatermark(img_src, dest, text, loc, fontsize=20, alpha=0.5):
fig = plt.figure()
# 读取图像
plt.imshow(plt.imread(img_src))
# 添加文字水印
plt.text(loc[0], loc[1], text, fontsize=fontsize, alpha=alpha, color='gray')
# 隐藏坐标轴
plt.axis('off')
# 保存图像
plt.savefig(dest, dpi=fig.dpi, bbox_inches='tight')
return fig
```
批量添加水印。
```python
for img in ['shanghai.jpg', 'shenzhen.jpg' ,'taibei.jpg']:
TextWatermark(img_src=img, dest='wm_%s'%img, text='SofaSofa.io', loc=[30, 50]);
```
![png](output_3_0.png)
![png](output_3_1.png)
![png](output_3_2.png)
### 2. 图像类型水印
考虑到水印本身的透明度,我们最好使用png类型的图像作为水印。此外,考虑到水印本身的大小,我们可以用`skimage.transform`中的`resize`函数修改水印的大小。
```python
import matplotlib.pyplot as plt
from skimage.transform import resize
import numpy as np
def ImgWatermark(img_src, dest, wm_src, loc, scale=5, alpha=0.5):
fig = plt.figure()
# 读取水印
watermark = plt.imread(wm_src)
# 调整水印大小
new_size = [int(watermark.shape[0]/scale), int(watermark.shape[1]/scale), watermark.shape[2]]
watermark = resize(watermark, new_size, mode='constant')
# 调整水印透明度
watermark[:, :, -1] *= alpha
# 读取图像
plt.imshow(plt.imread(img_src))
# 添加水印
plt.figimage(watermark, loc[0], loc[1], zorder=10)
# 隐藏坐标轴
plt.axis('off')
# 保存图像
plt.savefig(dest, dpi=fig.dpi, bbox_inches='tight')
return fig
```
批量添加水印。
```python
for img in ['shanghai.jpg', 'shenzhen.jpg' ,'taibei.jpg']:
ImgWatermark(img_src=img, dest='iwm_%s'%img, wm_src='sofasofa.png', loc=[40, 200]);
```
![png](output_7_0.png)
![png](output_7_1.png)
![png](output_7_2.png)