平常工作中,为保护原创,我们常常会给图片打水印,但是一般的工具存在水印只能添加在固定位置(比如左上、左下等),或者无法批量添加水印的问题。这些不灵活的应用会影响我们的工作效率。
今天,未明学院的老师就用Python帮大家解决这些问题,提高你的工作效率!
01
单张图片加图片水印
举个例子,我想为这张无水印图片打上水印:
首先导入用于完成打水印操作的Image模块:
from PIL import Image
使用 open() 函数指定要作为水印的图片:
watermark = Image.open(r"C:UsersadminDesktop运营批量给图片加水印LOGO.png")
指定要打水印的图片:
imageFile = Image.open(r"C:UsersadminDesktop运营批量给图片加水印数据分析技能课.jpg")
制作一个和imageFile大小相等的透明图片:
layer = Image.new('RGBA', imageFile.size, (0,0,0,0))
把水印图片贴在layer图片上,位置在右下角,距右边线300像素,下边线 100像素,如果layer.paste(watermark, (300, 100)),则是把水印打在左上角:
layer.paste(watermark, (imageFile.size[0]-300, imageFile.size[1]-100))
把layer和imageFile组合到一起,第2个参数是imageFile,第1、3个参数是layer:
out=Image.composite(layer,imageFile,layer)
保存带有水印的图片:
out.save(r"C:UsersadminDesktop运营批量给图片加水印数据分析技能课_图片水印.jpg")
现在可以看到图片右下角已经加上水印了:
02
单张图片加文字水印
除了添加图片水印,还可以添加文字水印!我们接着往下看~
首先,指定需要加水印的图片:
imageFile = Image.open(r"C:UsersadminDesktop运营批量给图片加水印数据分析技能课.jpg")
指定字体文件及字体大小:
font_big = ImageFont.truetype(r'C:UsersadminDesktop运营批量给图片加水印NotoSansCJKsc-Black.otf', 24)
font_samll = ImageFont.truetype(r'C:UsersadminDesktop运营批量给图片加水印NotoSansCJKsc-Black.otf', 15)
指定需要刻画的文字:
text1 = '未明学院'
text2 = 'http://www.enaca.cn'
准备在imageFile上刻画文字:
draw = ImageDraw.Draw(imageFile)
(imageFile.size[0]-450, imageFile.size[1]-85)用于指定刻画的文本的位置,以左上角为原点;text1和text2是要刻画的文本;fill设置刻画的文本的颜色,依次为RGB;font指定刻画的字体和大小:
draw.text((imageFile.size[0]-450, imageFile.size[1]-85), text1, fill=(134, 153, 153), font=font_big)
draw.text((imageFile.size[0]-485, imageFile.size[1]-45), text2, fill=(134, 153, 153),font=font_samll)
最后只需导出图像:
imageFile.save(r"C:UsersadminDesktop运营批量给图片加水印数据分析技能_文字水印.png")
一张带文字水印的图片就新鲜出炉啦~
03
批量添加图片水印
如果图片太多,还可以直接批量打水印。
首先,导入os模块和Image模块,前者用于获取文件路径,创建文件等操作;后者用于完成打水印操作:
import os
from PIL import Image
指定需要打水印的批量图片所在的文件夹:
start_folder =r"C:UsersadminDesktop运营批量给图片加水印等待打水印的图片"
指定图片打完水印之后保存的目的地文件夹:
target_folder = r"C:UsersadminDesktop运营批量给图片加水印完成打水印的图片"
如果指定的目的地文件夹不存在,那么就创建一个,如果存在就不需要创建了。
注意:target_folder只是一个代表路径的字符串,真正创建文件夹需要os.mkdir(today):
if not os.path.exists(target_folder):
os.mkdir(target_folder)
使用for...in遍历批量加水印,取出start_folder内的每一张图片进行打水印操作;其中os.listdir(start_folder)是start_folder文件夹下的每个文件的名字构成的列表:
for i in os.listdir(start_folder):
分别构建需要打水印的图片的完整路径start_file和打完水印的图片的完整路径target_file,包括所在文件夹、 和它的名字三个部分;其中os.sep 代表在路径中的一个 。这两个句子放在for循环中遍历:
start_file = start_folder + os.sep + i
target_file = target_folder + os.sep + i
以下部分参考前面单张图片打水印的代码说明~
指定作为水印的图片:
watermark = Image.open(r"C:UsersadminDesktop运营批量给图片加水印LOGO.png")
指定要打水印的图片:
imageFile = Image.open(start_file)
制作一个和imageFile大小相等的透明图片:
layer = Image.new('RGBA', imageFile.size, (0,0,0,0))
指定水印在图片中的位置,右下角:
layer.paste(watermark, (imageFile.size[0]-300, imageFile.size[1]-100))
把layer和imageFile组合到一起,第2个参数是imageFile,第1、3个参数是layer:
out=Image.composite(layer,imageFile,layer)
保存带有水印的图片:
out.save(target_file)
print(target_file + 'OK!')
没添加水印前:
添加水印后:
看了未明这么多期的技能贴,是不是感觉python很强大!
python可能除了不会生孩子,其他的什么都可以了~
原创不易,觉得本篇文章有用的话,请点个赞吧!