目录
前言
- 在Python中,Pillow是一个强大的图像处理库,它是PIL(Python Imaging Library)的一个分支,支持"jpeg",“png”,“bmp”,“gif”,“ppm”,“tiff” 等多种图像文件格式,通过本篇文章,你将了解到pillow库不同功能的实践方法,不止有读取和保存图片,创建缩略图和合并到图像、模糊、裁剪、翻转和旋转图像、调整大小和添加水印、添加滤镜和处理图像颜色等等。后面还会讲解一些利用Pillow库制作的一些图片脚本以及利用pyqt5和tkinter做的图形化界面。
导航
pillow的使用篇
- 图像处理库Pillow(PIL)的使用-1(实例+详细注释+图片脚本)
- 图像处理库Pillow(PIL)的使用-2(实例+详细注释+图片脚本)
- 图像处理库Pillow(PIL)的使用-3(实例+详细注释+图片脚本)
图片脚本篇
- python图片脚本1-批量处理图片尺寸(详细注释+GUI界面+exe可执行文件)
- python图片脚本2-图片文件批量命名(详细注释+GUI界面+exe可执行文件)
- python图片脚本3-批量图片格式转换-(详细注释+GUI界面+exe可执行文件)
- python图片脚本4-批量图片加水印(详细注释+GUI界面+exe可执行文件)
pillow库的使用
图片的保存
图片的保存主要有两种方法,分别是Image模块中的save方法和convert()方法,下面分别对他们进行介绍:
save()
Image模块中的save()方法用于保存图片,保存图片时,名称变的很重要,如果指定了图片格式,则会以指定的格式存储图片,如果不指定格式,它会以默认的图片格式来存储。
语法格式如下:
Image.save(fp,format=None,**params)
参数:
fp:图片存储路径(filepath)的缩写,字符串格式
format:可选参数,指定图片的格式
**params:其他可选参数,如quality参数可以控制图片质量等等
示例:
from PIL import Image #导入Image图像处理模块
#创建一个Image对象
image = Image.open('1.jpeg')
#保存图片,指定格式为png
image.save('1.png', 'png')
#如果format参数和前面不一致,以前面为主,下面就保存为1.jpg
image.save('1.jpg', 'png')
convert()
convert() 方法用于将图片转换为不同的模式,最后再用save保存
语法如下:
convert(mode,**params)
参数:
mode:要转换的图像模式
**params:其他可选参数 ,例如matrix转换矩阵等等
示例如下:
from PIL import Image # 导入Image图像处理模块
# 创建一个Image对象
image = Image.open('1.jpeg')
# convert()方法将图像转换为RGB模式
image.convert('RGB')
# 保存图像
image.save('1_rgb.jpeg')
图片的缩放
在图像处理过程中经常会遇到缩小或放大图像的情况,Image 类提供的 resize() 方法能够实现任意缩小和放大图像。
resize()
resize()可以实现图片的缩放效果,它返回一个新的Image对象,该对象具有指定的尺寸。原始图像不会被修改。
语法如下:
resize(size,resample=NEAREST,box=None)
参数解释:
size:二元组(width,height),指定新的图片的宽度和高度
resample:可选参数,用于指定在调整图像大小时使用的重采样滤波器
box:可选参数,指定要调整的图像的原始区域,是一个四元组(left,upper,right,lower),未指定则默认缩放整个图像
示例如下:
from PIL import Image # 导入Image图像处理模块
# 创建一个Image对象
image2 = Image.open('1.jpg')
print(f"原始图像大小: {image2.size}")
# 调整图片为600x600,并裁剪为100x100-400x300的区域
image2 = image2.resize((600, 600),box=(100,100,400,300))
# 显示图片
image2.show()
print(f"调整后图像大小: {image2.size}")
输出:
原始图像大小: (474, 325)
调整后图像大小: (600, 600)
图像的分离与合并
图像由许多像素点组成,像素是组成图像的基本单位,而每一个像素点又可以使用不同的颜色,图像的分离与合并指的就是图像颜色的分离与合并
spilt()
split() 方法用于将图像分离成其各个颜色通道。适用于处理多通道图像,比如RGB图像(红、绿、蓝三个通道)或RGBA图像(红、绿、蓝、透明度四个通道)。
示例如下:
from PIL import Image # 导入Image图像处理模块
# 创建一个Image对象
image = Image.open('images/bg.jpg')
# 分离颜色通道
r, g, b = image.split()
# 分别保存三个通道的图片
r.save('images/red.png')
g.save('images/green.png')
b.save('images/blue.png')
# 分别显示三个通道的图片
r.show('images/red.png')
g.show('images/green.png')
b.show('images/blue.png')
输出:
原图为:
meige()
Image 类提供的 merge() 方法可以实现图像的合并操作。注意,图像合并,可以是单个图像合并,也可以合并两个以上的图像。该函数也是返回一个Image对象
语法格式如下:
Image.merge(mode,bands)
参数:
mode:指定输出图片的模式
bands:参数类型为元组或者列表,其元素值是组成图像的颜色通道,比如 RGB 分别代表三种颜色通道,可以表示为 (r,g,b)
示例:
from PIL import Image # 导入Image图像处理模块
# 创建一个Image对象
image = Image.open('images/bg.jpg')
# 分离颜色通道
r, g, b = image.split()
# 合并三个通道的图片,注意通道顺序不同,图片颜色不同,比如下面是grb,如果是rgb就会合成原图颜色
merged = Image.merge('RGB', (g, r, b))
# 显示合并后的图片
merged.show()
输出:
另外和并图片需要两张图片的模式和图像大小一样,否则不能合并。因此,对于那些模式、大小不同的图片要进行预处理。
blend()
Image 类也提供了 blend() 方法来实现图片的叠加,语法如下:
Image.blend(iamge1,image2,aipha)
参数解释:
image1,image2:表示两个 Image 对象。
alpha:表示透明度,取值范围为 0 到 1,当取值为 0 时,输出图像相当于 image1 的拷贝,而取值为 1 时,则是 image2 的拷贝,只有当取值为 0.5 时,才为两个图像的中合。因此改值的大小决定了两个图像的混合程度。
示例:
from PIL import Image # 导入Image图像处理模块
# 实例化两个Image对象,resize()调整图片大小一致
im1 = Image.open('./images/bg.jpg').resize((500, 500))
im2 = Image.open('./images/1.jpg').resize((500, 500))
# 叠加图片
result = Image.blend(im1, im2, 0.5)
# 显示叠加后的图片
result.show()
输出:
图像的裁剪
图像的剪裁、复制、粘贴是图像处理过程中经常使用的基本操作,Pillow Image 类提供了简单、易用的 API 接口,能够帮助您快速实现这些简单的图像处理操作。
crop()
Image 类提供的 crop() 函数允许我们以矩形区域的方式对原图像进行裁剪,crop() 方法会返回一个 Image 对象语法格式如下:
crop(box=None)
box:表示裁剪区域,指定要裁剪的图像的原始区域,是一个四元组(x1,y1,x2,y2),表示图像的起始左上角和结束右下角的坐标,默认为 None,表示拷贝原图像
示例:
from PIL import Image # 导入Image图像处理模块
# 实例化一个Image对象
im = Image.open('./images/bg.jpg')
# 裁剪图片
cropped = im.crop((100, 100, 600, 400))
# 显示裁剪后的图片
cropped.show()
输出:
图像的几何变换
图像的几何变换主要包括图像翻转、图像旋转和图像变换操作,Image 类提供了处理这些操作的函数 transpose()、rotate() 和 transform(),下面分别对它们进行讲解。
transpose()
该函数可以实现图像的垂直、水平翻转,语法格式如下:
Image.transpose(method)
method 参数决定了图片要如何翻转,参数值如下:
- Image.FLIP_LEFT_RIGHT:左右水平翻转;
- Image.FLIP_TOP_BOTTOM:上下垂直翻转;
- Image.ROTATE_90:图像旋转 90 度;
- Image.ROTATE_180:图像旋转 180 度;
- Image.ROTATE_270:图像旋转 270 度;
- Image.TRANSPOSE:图像转置;
- Image.TRANSVERSE:图像横向翻转。
示例:
# 图像的几何变换
from PIL import Image # 导入Image图像处理模块
# 创建一个Image对象
image = Image.open('images/bg.jpg')
# 图像旋转90度
im2 = image.transpose(Image.ROTATE_90)
# 图像水平翻转
im3 = image.transpose(Image.FLIP_LEFT_RIGHT)
# 显示图像
im2.show()
im3.show()
输出:
rotate()
rotate()方法可以把图像旋转任意角度,语法格式如下:
Image.rotate(angle, resample=PIL.Image.NEAREST, expand=None, center=None, translate=None, fillcolor=None)
参数解释:
其中第一个为必选参数,其余为可选
angle:旋转的角度
resample:重采样滤波器
expand:布尔值,用于确定是否扩展输出图像以容纳整个旋转后的图像
center:旋转中心
translate:旋转后的平移量
fillcolor:填充颜色
示例
from PIL import Image # 导入Image图像处理模块
# 创建一个Image对象(宽高为500x500,背景色为米色)
im5 = Image.new('RGBA', (500, 500), "beige")
# 旋转45度
im_ratate = im5.rotate(45)
# 显示图像
im_ratate.show()
输出:
transform()
该函数能够对图像进行变换操作,通过指定的变换方式,产生一张规定大小的新图像,语法格式如下:
Image.transform(size, method, data=None, resample=0)
参数解释:
size:指定新图片的大小;
method:指定图片的变化方式,
data:该参数用来给变换方式提供所需数据;
resample:图像重采样滤波器
示例:
from PIL import Image # 导入Image图像处理模块
# 创建一个Image对象(宽高为500x500,背景色为米色)
im5 = Image.new('RGBA', (500, 500), "beige")
# 设置图像尺寸为300x300,图片的变换方式为EXTENT,变换后的图片的位置为(0,0)到(500,500)
im6 = im5.transform((300, 300), Image.EXTENT, (0, 0, 500, 500))
# 显示图像
im6.show()
输出:
共勉
好运都藏在努力里!
博客
- 本人是一个渗透爱好者,不时会在微信公众号(laity的渗透测试之路)更新一些实战渗透的实战案例,感兴趣的同学可以关注一下,大家一起进步。
- 之前在公众号发布了一个kali破解WiFi的文章,感兴趣的同学可以去看一下,在b站(up主:laity1717)也发布了相应的教学视频。