前言
我们浏览百度搜索,微博查看,总会看到形形色色的各种美图,有时想下载下来供自己晒图或者发朋友圈时使用,但是总会发现美图带有创造者的logo标志,类似这种带Logo的图片,一来为了宣传,二来防止收割党盗用。本实例分享如何批量为图片添加图片水印。给自己的喜爱的美图带上自己专属的logo。
思路分析
- 为图片添加图片水印的思路与添加文字水印的思路类似,都是使用PIL模块来实现,不同的是,由于这里需要将图片作为水印对象,因此需要对水印图片的像素点进行特殊处理,这里用到point()方法,Image类的point(function)方法接受一个函数参数,且对图片中的每一个点执行这个函数,这个函数是一个匿名函数,使用lambda表达式来完成,这里主要使用lambda表达式,将图片从模式“RGB”转换为“L”模式,具体转换公式为:L = R * 299/1000 + G * 587/1000+ B * 114/1000。
初始图片
代码参考
# -*- coding: utf-8 -*-
"""
@Time : 2021/2/13 16:11
@Auth : Yvon~早安阳光
@File :tupshuiyin
"""
from PIL import Image
import os
path = input('请输入要添加水印的图片所在路径:')
impath = input('请输入要作为水印图片的路径:')
positionflag = int(input('请输入水印位置(0:左上角,1:左下角,2:右上角,3:右下角,4:居中):'))
alphavalue = int(input('请输入水印透明度(范围在1――10之间):'))
# 图片水印
def imgMark(img):
im = Image.open(img) #打开原始图片
mark = Image.open(impath) #打开水印图片
rgbaim = im.convert('RGBA') # 将原始图片转换为RGBA
rgbamark = mark.convert('RGBA') # 将水印图片转换为RGBA
imgwidth, imgheight = rgbaim.size # 获取原始图片尺寸
nimgwidth, nimgheight = rgbamark.size # 获取水印图片尺寸
# 缩放水印图片
scale = 10
markscale = max(imgwidth / (scale * nimgwidth), imgheight / (scale * nimgheight))
newsize = (int(nimgwidth * markscale), int(nimgheight * markscale)) # 计算新的尺寸大小
rgbamark = rgbamark.resize(newsize, resample=Image.ANTIALIAS) # 重新设置水印图片大小
nimgwidth, nimgheight = rgbamark.size # 获取水印图片缩放后的尺寸
# 设置水印图片位置
if positionflag == 0: # 左上角
position = (0, 0)
elif positionflag == 1:# 左下角
position = (0, imgheight - nimgheight)
elif positionflag == 2: # 右上角
position = (imgwidth - nimgwidth, 0)
elif positionflag == 3: # 右下角
position = (imgwidth - nimgwidth, imgheight - nimgheight)
elif positionflag == 4: # 居中
position = (int(imgwidth / 2), int(imgheight / 2))
# 设置透明度:img.point(function)接受一个参数,且对图片中的每一个点执行这个函数,这个函数是一个匿名函数,使用lambda表达式来完成
# convert()函数,用于不同模式图像之间的转换,模式“L”为灰色图像,它的每个像素用8个bit表示,0表示黑,255表示白,其他数字表示不同的灰度。
# 在PIL中,从模式“RGB”转换为“L”模式是按照下面的公式转换的:L = R * 299/1000 + G * 587/1000+ B * 114/1000
rgbamarkpha = rgbamark.convert("L").point(lambda x: x / alphavalue)
rgbamark.putalpha(rgbamarkpha)
# 水印位置
rgbaim.paste(rgbamark, position, rgbamarkpha)
rgbaim.save(img) # 保存水印图片
try:
list = os.listdir(path) # 遍历选择的文件夹
for i in range(0, len(list)): # 遍历文件列表
filepath = os.path.join(path, list[i]) # 记录遍历到的文件名
if os.path.isfile(filepath): # 判断是否为文件
filetype = os.path.splitext(filepath)[1] # 获取扩展名
if filetype == '.png': # 判断是否为.png
imgMark(filepath) # 批量添加图片水印
print('批量添加图片水印完成')
except Exception as e:
print(e)