【零基础python实战】给图片批量打水印,想要什么效果,改改参数就好了~
前言
之前写菲律宾游记,想给自己的照片批量打上水印,首先想到的就是用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个子文件夹:
-
font文件夹存放字体;
-
input存放原始图片;
-
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,以后想要什么样的效果,改改参数就好了~
零基础Python学习资源介绍
👉Python学习路线汇总👈
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
👉Python必备开发工具👈
温馨提示:篇幅有限,已打包文件夹,获取方式在:文末
👉Python学习视频600合集👈
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
👉实战案例👈
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
👉100道Python练习题👈
检查学习结果。
👉面试刷题👈
资料领取
这份完整版的Python全套学习资料已为大家备好,朋友们如果需要可以微信扫描下方二维码添加,输入"领取资料" 可免费领取全套资料【有什么需要协作的还可以随时联系我】朋友圈也会不定时的更新最前言python知识。
好文推荐
了解python的前景: https://blog.csdn.net/weixin_49892805/article/details/127196159
python有什么用: https://blog.csdn.net/weixin_49892805/article/details/127214402
相关文章
- Python基础19-面向对象(高级)
- python进制转换函数-Python中进制转换函数的使用
- python中dtype什么意思_NumPy Python中的数据类型对象(dtype)
- python中替换字符串中字符_Python replace()函数:替换字符串中的某个字符「建议收藏」
- java与python-如何对比Python和Java,只需三分钟告诉你!
- Python基础语法知识点汇集「建议收藏」
- python socket recvfrom_Python:socket.recvfrom()不返回任何地址
- python在线代码编辑器-5种最佳Python IDE和代码编辑器
- 【说站】python如何将实例用作属性
- 【说站】python如何读取文件名
- 【说站】python字符串常用技巧的总结
- 【说站】python格式化经纬度的方法
- python判断文件后缀_Python 判断文件后缀是否被篡改
- python批量修改文件夹名称_python文件扩展名主要有
- python递归函数讲解_Python递归函数实例讲解
- 使用Python批量筛选上千个Excel文件中的某一行数据并另存为新Excel文件(下篇)
- 【python】SAX和DOM处理XML文件
- 【测试开发】python系列教程:Python 运算符
- Java 代码 执行Python脚本(亲测有效)
- Python基础语法-函数-函数装饰器-带参数的类装饰器
- 使用Python-VTK批量读取二维切片,并三维显示
- python转换字符串为datetime类型详解编程语言
- Python_day09_函数详解编程语言
- Linux上的Python之旅(linux自带python)
- 掌握Python访问MySQL的新技能(python访问mysql)
- Python类的访问权限(public、 private、protected)
- Linux环境下安装Python(linux装python)
- 手把手|20行Python代码教你批量将PDF文件转为Word格式(包教包会)
- python布尔操作实现代码
- python数据结构树和二叉树简介