用python给图片批量打水印
itomcoil 2025-05-24 14:42 14 浏览
之前写菲律宾游记,想给自己的照片批量打上水印,首先想到的就是用Python实现给图片加文字,然后写个循环。
做过图像识别的,应该知道OpenCV,其中cv2.putText()函数,就可以实现在图片上加文字,非常简单。
putText(img, text, org, fontFace, fontScale, color, thickness, lineType, bottomLeftOrigin)
参数解释:
img:需要添加文字的图片。
text:要加的文字内容。
org:文字的位置坐标。
fontFace:字体类型(可选择字体有限,可设置斜体)。
fontScale:字体大小。
color:字体颜色。
thickness:字体粗细。
lineType:线型。
bottomLeftOrigin:默认值为false,图片数据原点在左上角。
但putText()有个问题,不能添加中文文字,也不能指定字体,而PIL(Python Image Library)可以解决这个问题。
Image模块
Image是PIL中的核心模块,实现对图片的基础操作。
Image中的函数:
- Image. open(path):打开现成的图片,该图片在path所示的路径中。
- Image. new(mode, size, color):创建新的图片文件,color默认为黑色。
Image对象的属性:
- image.format:查看图像的格式,常见的有JPG、PNG等。
- image.mode:查看图像的模式。常用的例如RGB,3x8位像素,为真彩色;RGBA,4x8位像素,有透明通道的真彩色。
- image.size:获取图片的尺寸(长×宽),该二元组也表示图片的像素。
import os
import sys
from PIL import Image, ImageFont, ImageDraw
# 读入要打水印的照片
image = Image.open('./input/IMG_1422.jpg')
im_size = image.size
print(image.format)
print(image.mode)
print(im_size)
image.show()
----------------------
[out] JPEG
[out] RGB
[out] (1536, 2048)
原始照片:
ImageDraw模块
ImageDraw模块,提供对图像进行绘制的方法。
- ImageDraw.Draw(image):创建画刷。
- ImageFont.truetype(file, size) :设置字体和大小,file提供字体的路径,size为文字大小。在C盘(系统盘)-Windows-Fonts里面,有计算机上安装的所有字体,选一个喜欢的。
- draw.text(xy, text, fill, font):根据位置、内容、颜色、字体把文字写进图片中。 xy:位置,即距离图片左上角起始点的坐标。 这里普及一下图片坐标系统的概念。 图片坐标常用二元组(x,y),(0,0)位于左上角。 四元组表示图片左、上、右、下的坐标,例如800x600像素的长方形图片表示为(0,0,800,600)。 text:字符串,即文字内容。 fill:文字颜色。 font:字体和大小,通过上述ImageFont来定义。
用draw.text()加水印文字,特别简单!
########### 加文字 ###########
draw_txt = ImageDraw.Draw(image)
txt_size = int(im_size[0]*0.02)
# 设置字体和文字大小
chi_font = ImageFont.truetype('./font/fzstk.ttf', size=txt_size)
# 直接在照片上写文字
draw_txt.text(xy = (im_size[0]//2-txt_size//2,im_size[1]-int(txt_size*1.2)),
text = '@化简可得',
font = chi_font)
image.show()
Image中的方法
- image.show():展示图像,Win系统下show会打开系统自带的图像显示程序。
- image.transpose(method):图像翻转或者旋转,例如ROTATE_90表示将图像逆时针旋转90°。
- image. thumbnail (size):制作缩略图,参数size指定最大的宽度和高度。
- image.paste(region, box, mask):将一张图粘贴到另一张图上。 image:底图; region:要粘贴上底图的图,即水印图片; box:要粘贴的位置,2元组表示左上角坐标; mask:对应的模板图像来填充所对应的区域,模板图像的尺寸必须与region对应的图像尺寸一样,原图像和模板图像可以为同一个图。
- image. save(path, quality):针对JPG格式,quality参数表示保存图像的质量,值的范围从1(最差)到95(最佳)。 默认值为75,此时图片会被压缩。
用image.paste()加水印图,也特别简单!
########### 加图片 ###########
# 读入水印图
# 还没设计过自己的水印logo,所以随便在网上找了一个小太阳做示范
mark_image = Image.open('./sun.png')
# 这个小太阳有点大,压缩一下
mark_image.thumbnail((150, 150))
# 将小太阳加在照片左上角的位置
position = mark_size//3, mark_size//3
image.paste(mark_image, position, mark_image)
image.show()
小结
新建watermark文件夹,该文件夹下放入Python文件,并新建3个子文件夹:
1. font文件夹存放字体;
2. input存放原始图片;
3. output文件夹为空,程序跑完后打好水印的图片会输出到该文件夹。
跑批代码,下面自取~
########## 批量加水印文字 #########
import os
import sys
from PIL import Image, ImageFont, ImageDraw
def add_watermark(image_file):
image = Image.open(image_file)
draw_txt = ImageDraw.Draw(image)
im_size = image.size
print('原始图片尺寸:',im_size)
if im_size[0]>im_size[1]: #如果是横版
txt_size = int(im_size[0]*0.02)
else:
txt_size = int(im_size[1]*0.02)
print('水印文字尺寸:',txt_size)
# 设置字体和文字大小
chi_font = ImageFont.truetype('./font/fzstk.ttf', size=txt_size)
# 直接在照片上写文字
draw_txt.text(xy = (im_size[0]//2-txt_size//2, im_size[1]-int(txt_size*1.2)),
text = '@化简可得',
font = chi_font)
name = os.path.basename(image_file)
new_name = os.path.join('.\output', name)
image.save(new_name, quality=95)
### 循环读入照片
files = os.listdir('.\input')
for file in files:
image_file = os.path.join('.\input', file)
print(image_file)
add_watermark(image_file)
########## 批量加水印照片 #########
import os
import sys
from PIL import Image, ImageFont, ImageDraw
# 读入水印图
mark_image = Image.open('./sun.png')
def add_watermark(image_file):
image = Image.open(image_file)
im_size = image.size
print('原始图片尺寸:',im_size)
if im_size[0]>im_size[1]: #如果是横版
mark_size = int(im_size[0]*0.08)
else:
mark_size = int(im_size[1]*0.08)
mark_image.thumbnail((mark_size, mark_size))
print('水印图片尺寸:',mark_image.size)
position = mark_size//3, mark_size//3
image.paste(mark_image, position, mark_image)
name = os.path.basename(image_file)
new_name = os.path.join('.\output', name)
image.save(new_name, quality=95)
# 循环读入照片
files = os.listdir('.\input')
for file in files:
image_file = os.path.join('.\input', file)
print(image_file)
add_watermark(image_file)
当然,网上有很多现成的软件,也能实现批量打水印。但我还是喜欢用Python,以后想要什么样的效果,改改参数就好了~
参考链接
- Win10 + Opencv3 for Python 的安装过程 https://www.jianshu.com/p/c3af3cadf372
- Py之cv2:cv2库的简介、安装、使用方法(常见函数、方法等)最强详细攻略 https://blog.csdn.net/qq_41185868/article/details/79675875#%E5%85%B3%E4%BA%8EOpenCV%E7%AE%80%E4%BB%8B
- python PIL 图像处理库简介(一) https://www.cnblogs.com/lyrichu/p/9124504.html
- python PIL的Image.resize()和Image.thumbnail()函数的区别 https://blog.csdn.net/TeFuirnever/article/details/90597048
- 上一篇:深度聚类的可视化解释
- 下一篇:没有复杂的调参,只需要五行代码实现图片像素风格化!
相关推荐
- 最强聚类模型,层次聚类 !!_层次聚类的优缺点
-
哈喽,我是小白~咱们今天聊聊层次聚类,这种聚类方法在后面的使用,也是非常频繁的~首先,聚类很好理解,聚类(Clustering)就是把一堆“东西”自动分组。这些“东西”可以是人、...
- python决策树用于分类和回归问题实际应用案例
-
决策树(DecisionTrees)通过树状结构进行决策,在每个节点上根据特征进行分支。用于分类和回归问题。实际应用案例:预测一个顾客是否会流失。决策树是一种基于树状结构的机器学习算法,用于解决分类...
- Python教程(四十五):推荐系统-个性化推荐算法
-
今日目标o理解推荐系统的基本概念和类型o掌握协同过滤算法(用户和物品)o学会基于内容的推荐方法o了解矩阵分解和深度学习推荐o掌握推荐系统评估和优化技术推荐系统概述推荐系统是信息过滤系统,用于...
- 简单学Python——NumPy库7——排序和去重
-
NumPy数组排序主要用sort方法,sort方法只能将数值按升充排列(可以用[::-1]的切片方式实现降序排序),并且不改变原数组。例如:importnumpyasnpa=np.array(...
- PyTorch实战:TorchVision目标检测模型微调完
-
PyTorch实战:TorchVision目标检测模型微调完整教程一、什么是微调(Finetuning)?微调(Finetuning)是指在已经预训练好的模型基础上,使用自己的数据对模型进行进一步训练...
- C4.5算法解释_简述c4.5算法的基本思想
-
C4.5算法是ID3算法的改进版,它在特征选择上采用了信息增益比来解决ID3算法对取值较多的特征有偏好的问题。C4.5算法也是一种用于决策树构建的算法,它同样基于信息熵的概念。C4.5算法的步骤如下:...
- Python中的数据聚类及可视化分析实践
-
探索如何通过聚类分析揭露糖尿病预测数据集的特征!我们将运用Python的强力工具,深入挖掘数据,以直观的可视化揭示不同特征间的关系。一同探索聚类分析在糖尿病预测中的实践!所有这些可视化都可以通过数据操...
- 用Python来统计大乐透号码的概率分布
-
用Python来统计大乐透号码的概率分布,可以按照以下步骤进行:导入所需的库:使用Python中的numpy库生成数字序列,使用matplotlib库生成概率分布图。读取大乐透历史数据:从网络上找到大...
- python:支持向量机监督学习算法用于二分类和多分类问题示例
-
监督学习-支持向量机(SVM)支持向量机(SupportVectorMachine,简称SVM)是一种常用的监督学习算法,用于解决分类和回归问题。SVM的目标是找到一个最优的超平面,将不同类别的...
- 25个例子学会Pandas Groupby 操作
-
groupby是Pandas在数据分析中最常用的函数之一。它用于根据给定列中的不同值对数据点(即行)进行分组,分组后的数据可以计算生成组的聚合值。如果我们有一个包含汽车品牌和价格信息的数据集,那么可以...
- 数据挖掘流程_数据挖掘流程主要有哪些步骤
-
数据挖掘流程1.了解需求,确认目标说一下几点思考方法:做什么?目的是什么?目标是什么?为什么要做?有什么价值和意义?如何去做?完整解决方案是什么?2.获取数据pandas读取数据pd.read.c...
- 使用Python寻找图像最常见的颜色_python 以图找图
-
如果我们知道图像或对象最常见的是哪种颜色,那么可以解决图像处理中的几个用例,例如在农业领域,我们可能需要确定水果的成熟度。我们可以简单地检查一下水果的颜色是否在预定的范围内,看看它是成熟的,腐烂的,还...
- 财务预算分析全网最佳实践:从每月分析到每天分析
-
原文链接如下:「链接」掌握本文的方法,你就掌握了企业预算精细化分析的能力,全网首发。数据模拟稍微有点问题,不要在意数据细节,先看下最终效果。在编制财务预算或业务预算的过程中,通常预算的所有数据都是按月...
- 常用数据工具去重方法_数据去重公式
-
在数据处理中,去除重复数据是确保数据质量和分析准确性的关键步骤。特别是在处理多列数据时,保留唯一值组合能够有效清理数据集,避免冗余信息对分析结果的干扰。不同的工具和编程语言提供了多种方法来实现多列去重...
- Python教程(四十):PyTorch深度学习-动态计算图
-
今日目标o理解PyTorch的基本概念和动态计算图o掌握PyTorch张量操作和自动求导o学会构建神经网络模型o了解PyTorch的高级特性o掌握模型训练和部署PyTorch概述PyTorc...
- 一周热门
- 最近发表
- 标签列表
-
- ps图案在哪里 (33)
- super().__init__ (33)
- python 获取日期 (34)
- 0xa (36)
- super().__init__()详解 (33)
- python安装包在哪里找 (33)
- linux查看python版本信息 (35)
- python怎么改成中文 (35)
- php文件怎么在浏览器运行 (33)
- eval在python中的意思 (33)
- python安装opencv库 (35)
- python div (34)
- sticky css (33)
- python中random.randint()函数 (34)
- python去掉字符串中的指定字符 (33)
- python入门经典100题 (34)
- anaconda安装路径 (34)
- yield和return的区别 (33)
- 1到10的阶乘之和是多少 (35)
- python安装sklearn库 (33)
- dom和bom区别 (33)
- js 替换指定位置的字符 (33)
- python判断元素是否存在 (33)
- sorted key (33)
- shutil.copy() (33)