Pillow 简介、特点和安装
Pillow 简介
Pillow作为python的第三方图像处理库,提供了广泛的文件格式支持,强大的图像处理能力,主要包括图像储存、图像显示、格式转换以及基本的图像处理操作等。
PIL(Python Image Library)是python的第三方图像处理库,因其强大的功能与众多的使用人数,但由于PIL仅支持到Python 2.7,于是一群志愿者在PIL的基础上创建了兼容的版本,名字叫Pillow,支持最新Python 3.x,又加入了许多新特性,因此,我们可以直接安装使用Pillow。
Pillow 特点
1) 支持广泛的文件格式
Pillow 支持广泛的图像格式,比如 "jpeg","png","bmp","gif","ppm","tiff" 等。同时,它也支持图像格式之间的相互转换。总之, Pillow 几乎能够处理任何格式的图像。
2) 提供了丰富的功能
Pillow 提供了丰富的图像处理功能,可概括为两个方面:
- 图像归档
- 图像处理
图像归档,包括创建缩略图、生成预览图像、图像批量处理等;而图像处理,则包括调整图像大小、裁剪图像、像素点处理、添加滤镜、图像颜色处理等。
3) 配合GUI工具使用
Pillow 库可以配合 Python GUI(图形用户界面)工具 Tkinter 一起使用。
除上述特点之外,Pillow 库还能实现一些较为复杂的图像处理操作,比如给图像添加水印、合成 GIF 动态效果图等等。
Pillow 安装
在命令行下通过pip安装:
pip install pillow
Pillow 使用指南
pillow 官方文档地址:https://pillow.readthedocs.io/en/stable/handbook/tutorial.html#using-the-image-class
Pillow 基本操作
1.使用Image模块中的open函数打开一张图片:
from PIL import Image
# 第一章节:Pilow 基础功能:读取/属性值/显示
# 加载图片
im = Image.open("img/1.png")
如果成功,这个函数返回Image对象。您现在可以使用实例属性来检查文件内容:
# 图片属性
print(im.format, im.size, im.mode)
# format = 图片格式类型
# siz = 图片长*宽
# mode = 显示模式 RGB模式、CMYK模式、HSB模式、Lab模式、位图模式、灰度模式、索引颜色模式、双色调模式和多通道模式
如果文件不能打开,则抛出IOError异常。
2.图像显示
存在Image对象时,就可以利用它来处理操作图像,例如,加载一张图像。
# 图片显示
im.show()
3.保存指定格式的图像
im.save("img/2.png")
Pillow 图像读取和写入/图片转换
from PIL import Image
# 第二章节:Pilow 基础功能:图像格式转换
try:
# 打开图片
with Image.open('img/1.png') as im:
# 保存为PNG格式,如果格式不一致会提示异常。
im.save("img/2.png")
except OSError as e:
# 打印错误日志记录
print(e)
图片格式之间的转换主要方法
save():
save() 方法用于保存图像,当不指定文件格式时,它会以默认的图片格式来存储;如果指定图片格式,则会以指定的格式存储图片。
save() 的语法格式如下:
Image.save(fp, format=None)
参数说明如下:
- fp:图片的存储路径,包含图片的名称,字符串格式;
- format:可选参数,可以指定图片的格式。
Pillow 图像缩略图
缩略图(thumbnail image)指的是将原图缩小至一个指定大小(size)的图像。通过创建缩略图可以使图像更易于展示和浏览。
Image 对象提供了一个 thumbnail() 方法用来生图像的缩略图,该函数的语法格式如下:
thumbnail(size,resample)
-
size:元组参数,指的是缩小后的图像大小;
-
resample:可选参数,指图像重采样滤波器,有四种过滤方式,分别是 Image.BICUBIC(双立方插值法)、PIL.Image.NEAREST(最近邻插值法)、PIL.Image.BILINEAR(双线性插值法)、PIL.Image.LANCZOS(下采样过滤插值法),默认为 Image.BICUBIC。
from PIL import Image
第三章节:Pilow 基础功能:图像缩略图
try:
# 打开图片
with Image.open('img/1.png') as im:
# 设定缩放的大小
size = (128, 128)
# 使用Pillow创建缩略图
im.thumbnail(size)
# 保存为PNG格式,如果格式不一致会提示异常。
im.save('img/3.png')
except OSError as e:
# 打印错误日志记录
print(e)
Pillow 图像剪裁、粘贴和合并
Pillow 图像剪裁
Image 类提供的 crop() 函数允许我们以矩形区域的方式对原图像进行裁剪,函数的语法格式如下:
crop(box=None)
box:表示裁剪区域,默认为 None,表示拷贝原图像。
注意:box 是一个有四个数字的元组参数 (x_左上,y_左下,x1_右上,y1_右下),分别表示被裁剪矩形区域的左上角 x、y 坐标和右下角 x,y 坐标。默认 (0,0) 表示坐标原点,宽度的方向为 x 轴,高度的方向为 y 轴,每个像素点代表一个单位。
from PIL import Image
# 第四章节:Pilow 基础功能:图像截取
try:
# 打开图片
with Image.open('img/1.png') as im:
# 设定截取区域
box = (100, 100, 400, 400)
# 图像截取
region = im.crop(box)
# 保存为PNG格式,如果格式不一致会提示异常。
region.save('img/4.png')
except OSError as e:
# 打印错误日志记录
print(e)
Pillow 图像粘贴
拷贝、粘贴操作几乎是成对出现的,Image 类提供了 copy() 和 paste() 方法来实现图像的复制和粘贴。其中复制操作(即 copy() 方法)比较简单,下面主要介绍 paste() 粘贴方法,语法格式如下所示:
paste(image, box=None, mask=None)
该函数的作用是将一张图片粘贴至另一张图片中。注意,粘贴后的图片模式将自动保持一致,不需要进行额外的转换。参数说明如下:
-
image:指被粘贴的图片;
-
box:指定图片被粘贴的位置或者区域,其参数值是长度为 2 或者 4 的元组序列,长度为 2 时,表示具体的某一点 (x,y);长度为 4 则表示图片粘贴的区域,此时区域的大小必须要和被粘贴的图像大小保持一致。
-
mask:可选参数,为图片添加蒙版效果。
from PIL import Image
第五章节:Pilow 基础功能:图像粘贴
try:
# 打开图片
with Image.open('img/1.png') as im:
# 设定截取区域
box = (100, 100, 200, 200)
# 图像截取
region = im.crop(box)
# 图像粘贴
im.paste(region, box)
# 保存为PNG格式,如果格式不一致会提示异常。
im.save('img/5.png')
except OSError as e:
# 打印错误日志记录
print(e)
通过图像粘贴实现图像合并
from PIL import Image
# 第七章节:Pilow 基础功能:图像合并
def merge(im1, im2):
w = im1.size[0] + im2.size[0]
h = max(im1.size[1], im2.size[1])
im = Image.new("RGBA", (w, h))
im.paste(im1)
im.paste(im2, (im1.size[0], 0))
return im
try:
# 合并图片
mergeImg = merge(Image.open('img/1.png'),Image.open('img/2.png'))
# 图片保存
mergeImg.save("img/7.png")
except OSError as e:
# 打印错误日志记录
print(e)
通过图像粘贴实现图像滚动
from PIL import Image
# 第六章节:Pilow 基础功能:图像滚动
def roll(img, delta):
"""Roll an image sideways."""
xsize, ysize = img.size
delta = delta % xsize
if delta == 0:
return im
part1 = img.crop((0, 0, delta, ysize))
part2 = img.crop((delta, 0, xsize, ysize))
img.paste(part1, (xsize - delta, 0, xsize, ysize))
img.paste(part2, (0, 0, xsize - delta, ysize))
return img
try:
# 打开图片
with Image.open('img/1.png') as im:
# 图像滚动方法
rollImg = roll(im, 100)
# 保存为PNG格式,如果格式不一致会提示异常。
rollImg.save('img/6.png')
except OSError as e:
# 打印错误日志记录
print(e)
Pillow 图像合并
Image 类提供了用于分离图像和合并图像的方法 split() 和 merge() 方法,通常情况下,这两个方法会一起使用。
merge()
Image 类提供的 merge() 方法可以实现图像的合并操作。注意,图像合并,可以是单个图像合并,也可以合并两个以上的图像。
merge() 方法的语法格式如下:
Image.merge(mode, bands)
参数说明如下:
- mode:指定输出图片的模式
- bands:参数类型为元组或者列表序列,其元素值是组成图像的颜色通道,比如 RGB 分别代表三种颜色通道,可以表示为 (r,g,b)。
温馨注意,该函数会返回一个新的 Image 对象。
from PIL import Image
im=Image.open("img/1.png")
#修改图像大小,以适应图像处理
image=im.resize((450,400))
image.save("img/1-1.png")
#分离颜色通道,产生三个 Image对象
r,g,b = image.split()
#重新组合颜色通道,返回先的Image对象
image_merge=Image.merge('RGB',(b,g,r))
image_merge.show()
#保存图像至桌面
image_merge.save("img/1-2.png")
Pillow 几何变换
图像的几何变换主要包括图像翻转、图像旋转和图像变换操作,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
# 第九章节:Pilow 几何变换:转换
try:
# 打开图片
with Image.open('img/1.png') as im:
out = im.transpose(Image.Transpose.FLIP_LEFT_RIGHT)
out.save("img/9-1.png")
out = im.transpose(Image.Transpose.FLIP_TOP_BOTTOM)
out.save("img/9-2.png")
out = im.transpose(Image.Transpose.ROTATE_90)
out.save("img/9-3.png")
out = im.transpose(Image.Transpose.ROTATE_180)
out.save("img/9-4.png")
out = im.transpose(Image.Transpose.ROTATE_270)
out.save("img/9-5.png")
except OSError as e:
# 打印错误日志记录
print(e)
rotate()任意角度旋转
当我们想把图像旋转任意角度时,可以使用 rotate() 函数,语法格式如下:
Image.rotate(angle, resample=PIL.Image.NEAREST, expand=None, center=None, translate=None, fillcolor=None)
参数说明如下:
-
angle:表示任意旋转的角度;
-
resample:重采样滤波器,默认为 PIL.Image.NEAREST 最近邻插值方法;
-
expand:可选参数,表示是否对图像进行扩展,如果参数值为 True 则扩大输出图像,如果为 False 或者省略,则表示按原图像大小输出;
-
center:可选参数,指定旋转中心,参数值是长度为 2 的元组,默认以图像中心进行旋转;
-
translate:参数值为二元组,表示对旋转后的图像进行平移,以左上角为原点;
-
fillcolor:可选参数,填充颜色,图像旋转后,对图像之外的区域进行填充。
from PIL import Image
第八章节:Pilow 几何变换:基础
try:
# 打开图片
with Image.open('img/1.png') as im:
# 图像设置大小
out = im.resize((145, 145))
out.save('img/8.png')
# 图像旋转角度
rotateImg = im.rotate(45)
# 保存为PNG格式,如果格式不一致会提示异常。
rotateImg.save('img/8-1.png')
except OSError as e:
# 打印错误日志记录
print(e)
Pillow 相等调整大小
PIL.ImageOps.contain(image, size, method=Image.Resampling.BICUBIC):
返回图像的调整大小版本,设置为最大宽度和高度,在要求的尺寸内,同时保持原始的纵横比。
参数说明:
-
image -- 要调整大小和裁剪的图像
-
size -- 请求的输出大小(以像素为单位),以(宽度、高度)元组的形式给出。
-
method - 默认使用Image.Resampling.BICUBIC,详见过滤器
PIL.ImageOps.cover(image, size, method=Image.Resampling.BICUBIC)
返回图像的调整大小版本,同时保持原始的纵横比。
参数说明:
-
image -- 要调整大小和裁剪的图像
-
size -- 请求的输出大小(以像素为单位),以(宽度、高度)元组的形式给出。
-
method - 默认使用Image.Resampling.BICUBIC,详见过滤器
PIL.ImageOps.fit(image, size, method=Image.Resampling.BICUBIC, bleed=0.0, centering=(0.5, 0.5)):
返回图像的调整大小和裁剪版本,裁剪为要求的长宽比和尺寸。
参数说明:
- image -- 要调整大小和裁剪的图像
- size -- 请求的输出大小(以像素为单位),以(宽度、高度)元组的形式给出。
- method - 默认使用Image.Resampling.BICUBIC,详见过滤器
bleed-图像移除四周边框,该数值为百分比,默认值为0
centering-控制裁剪位置。 使用 (0.5, 0.5) 表示中心裁剪
PIL.ImageOps.pad(image, size, method=3, color=None, centering=0.5, 0.5)
返回图像的大小和填充版本,展开以填充请求的纵横比和大小。
参数说明:
-
image -- 要调整大小和裁剪的图像。
-
size -- 请求的输出大小(以像素为单位),以(宽度、高度)元组的形式给出。
-
method -- 使用什么样的重采样方法。默认是 PIL.Image.BICUBIC . 见过滤器 :
-
color -- 填充图像的背景色。
-
centering -- 控制原始图像在填充版本中的位置。(0.5,0.5)将使图像居中(0,0)将使图像与左上角对齐(1,1)将使图像与右下角对齐
from PIL import Image, ImageOps
第十章节:Pilow 几何变换:相对调整
try:
# 打开图片
size = (100, 150)
with Image.open('img/1.png') as im:
ImageOps.contain(im, size).save("imageops_contain.png")
ImageOps.cover(im, size).save("imageops_cover.png")
ImageOps.fit(im, size).save("imageops_fit.png")
ImageOps.pad(im, size, color="#f00").save("imageops_pad.png")# thumbnail() can also be used, # but will modify the image object in place im.thumbnail(size) im.save("imageops_thumbnail.png")
except OSError as e:
# 打印错误日志记录
print(e)
Pillow 颜色模式转换
convert(mode,matrix,dither,palette,colors)
convert方法可以改变图像的模式(mode),一般是在'RGB'(真彩图)、'L'(灰度图)、'CMYK'(压缩图)之间转换。
from PIL import Image, ImageOps
# 第十一章节:Pilow 转换:通道转换
try:
with Image.open('img/1.png') as im:
print(im.format)
imgConvert = im.convert("L")
imgConvert.save("img/11.png")
except OSError as e:
# 打印错误日志记录
print(e)
Pillow图像过滤器 filter
filter方法可以将一些过滤器操作应用于原始图像,比如模糊,边缘增强、浮雕等。filter是过滤器函数,在PIL.ImageFilter函数中定义了大量内置的filter函数,比如BLUR(普通模糊),GaussianBlur(高斯模糊) FIND_EDGES(查找边)等。
Pillow 通过 ImageFilter 类达到图像降噪的目的,该类中集成了不同种类的滤波器,通过调用它们从而实现图像的平滑、锐化、边界增强等图像降噪操作。常见的降噪滤波器如下表所示:
名称 | 说明 |
---|---|
ImageFilter.BLUR | 模糊滤波,即均值滤波 |
ImageFilter.CONTOUR | 轮廓滤波,寻找图像轮廓信息 |
ImageFilter.DETAIL | 细节滤波,使得图像显示更加精细 |
ImageFilter.FIND_EDGES | 寻找边界滤波(找寻图像的边界信息) |
ImageFilter.EMBOSS | 浮雕滤波,以浮雕图的形式显示图像 |
ImageFilter.EDGE_ENHANCE | 边界增强滤波 |
ImageFilter.EDGE_ENHANCE_MORE | 深度边缘增强滤波 |
ImageFilter.SMOOTH | 平滑滤波 |
ImageFilter.SMOOTH_MORE | 深度平滑滤波 |
ImageFilter.SHARPEN | 锐化滤波 |
ImageFilter.GaussianBlur() | 高斯模糊 |
ImageFilter.UnsharpMask() | 反锐化掩码滤波 |
ImageFilter.Kernel() | 卷积核滤波 |
ImageFilter.MinFilter(size) | 最小值滤波器,从 size 参数指定的区域中选择最小像素值,然后将其存储至输出图像中。 |
ImageFilter.MedianFilter(size) | 中值滤波器,从 size参数指定的区域中选择中值像素值,然后将其存储至输出图像中。 |
ImageFilter.MaxFilter(size) | 最大值滤波器 |
ImageFilter.ModeFilter() | 模式滤波 |
[图像降噪滤波器] |
from PIL import Image, ImageFilter
# 第十二章节:Pilow 增强:滤波器
try:
with Image.open('img/1.png') as im:
out = im.filter(ImageFilter.DETAIL)
out.save("img/12.png")
except OSError as e:
# 打印错误日志记录
print(e)
from PIL import Image, ImageFilter
im = Image.open('cat.jpg')
# 高斯模糊
im_gaussianblur = im.filter(ImageFilter.GaussianBlur)
im_gaussianblur.show()
# 普通模糊
im_blur = im.filter(ImageFilter.BLUR)
im_blur.show()
# 找到边缘
im_find_edge = im.filter(ImageFilter.FIND_EDGES)
im_find_edges.show()
# 浮雕
im_emboss = im.filter(ImageFilter.EMBOSS)
im_emboss.show()
# 轮廓
im_contour = im.filter(ImageFilter.CONTOUR)
im_contour.show()
# 锐化
im_sharpen = im.filter(ImageFilter.SHARPEN)
im_sharpen.show()
# 平滑
im_smooth = im.filter(ImageFilter.SMOOTH)
im_smooth.show()
# 细节
im_detail = im.filter(ImageFilter.DETAIL)
im_detail.show()
Pillow 画笔操作
point()方法可用于转换图像的像素值。point()方法接受函数方法对象用户放大/缩放像素值。
from PIL import Image
# 第十三章节:Pilow 增强:画笔
try:
with Image.open('img/1.png') as im:
# 每个像素点扩大 1.2倍
out = im.point(lambda i: i * 1.2)
out.save("img/13.png")
except OSError as e:
# 打印错误日志记录
print(e)
Pillow 各个波段操作
from PIL import Image
# 第十四章节:Pilow 增强:通道加强
try:
with Image.open('img/1.png') as im:
# 图像通道分离
source = im.split()
# 通道下标
R, G, B = 0, 1, 2
# select regions where red is less than 100
mask = source[R].point(lambda i: i < 100 and 255)
# process the green band
out = source[G].point(lambda i: i * 0.7)
# paste the processed band back, but only where red was < 100
source[G].paste(out, None, mask)
# build a new multiband image
im = Image.merge(im.mode, source)
im.save("img/14.png")
except OSError as e:
# 打印错误日志记录
print(e)
Pillow 强化
图像增强也是图像预处理中的一个基本技术,Pillow中的图像增强函数主要在ImageEnhance模块下,通过该模块可以调节图像的白平衡(Color)、亮度(Brightness)、对比度(Contrast)和锐化(Sharpness)等。
from PIL import Image, ImageEnhance
# 第十五章节:Pilow 高级增强:对比度、亮度、色彩平衡和锐度
try:
with Image.open('img/1.png') as im:
enh = ImageEnhance.Contrast(im)
enh.enhance(1.5).show("30% more contrast")
except OSError as e:
# 打印错误日志记录
print(e)
Pillow 动态图
Pillow支持一些动态图片的格式如FLI/FLC,GIF和其他一些处于实验阶段的格式。TIFF文件同样可以包含数帧图像。
当读取动态图时,PIL自动读取动态图的第一帧,可以使用seek和tell方法读取不同帧。
from PIL import Image
with Image.open("animation.gif") as im:
im.seek(1) # skip to the second frame
try:
while 1:
im.seek(im.tell() + 1)
# do something to im
except EOFError:
pass # end of sequence
温馨提示:当读取到最后一帧时,Pillow抛出EOFError异常。 解决办法:通过动态图迭代器
动态图迭代器类
# _*_ coding : UTF-8_*_
# 开发者 : zhuozhiwengang
# 开发时间 : 2024/3/20 0:20
# 文件名称 : pillowDemo16
# 开发工具 : PyCharm
from PIL import Image, ImageEnhance, ImageSequence
# 第十六章节:Pilow 图像序列
im = Image.open("img/1.gif")
# 使用ImageSequence迭代器访问每一帧
for frame in (ImageSequence.Iterator, im):
print(frame)
class ImageSequence:
def __init__(self, im):
self.im = im
def __getitem__(self, ix):
try:
if ix:
self.im.seek(ix)
return self.im
except EOFError:
raise IndexError # end of sequence
for frame in ImageSequence(im):
# ...do something to frame...
Pillow 图片添加水印
ImageDraw
PIL.ImageDraw 模块提供了一系列的绘图方法,通过该模块可以创建一个新的图形,或者在现有的图像上再绘制一个图形,从而起到对原图注释和修饰的作用。
下面创建一个 ImageDraw 对象,并对该对象的使用方法做简单介绍:
draw = ImageDraw.Draw(im)
上述方法会返回一个 ImageDraw 对象,参数 im 表示 Image 对象。这里我们可以把 Image 对象理解成画布,通过调用 ImageDraw 对象的一些方法,实现了在画布上绘制出新的图形目的。ImageDraw 对象的常用方法如下表所示:
方法 | 说明 |
---|---|
text | 在图像上绘制文字 |
line | 绘制直线、线段 |
eclipse | 绘制椭圆形 |
rectangle | 绘制矩形 |
polygon | 绘制多边形 |
[ImageDraw常用方法] |
# 第十七章节:Pilow 图像绘制
from PIL import Image, ImageDraw
# 创建 Image 对象,当做背景图
im = Image.new('RGB', (200, 200), color='gray')
# 创建 ImageDraw 对象
draw = ImageDraw.Draw(im)
# 以左上角为原点,绘制矩形。元组坐标序列表示矩形的位置、大小;fill设置填充色为红色,outline设置边框线为黑色
draw.rectangle((50, 100, 100, 150), fill=(255, 0, 0), outline=(0, 0, 0))
# 查看原图片
im.show()
# 保存图片
im.save('img/17.png')
ImageFont
PIL.ImagreFont 模块通过加载不同格式的字体文件,从而在图像上绘制出不同类型的文字,比如 TrueType 和 OpenType 类型的字体。
创建字体对象的语法格式如下:
font = ImageFont.truetype(font='字体文件路径', size=字体大小)
如果想要在图片上添加文本,还需要使用 ImageDraw.text() 方法,语法格式如下:
d.text((x,y), "text", font, fill)
参数说明如下:
-
(x,y):图像左上角为坐标原点,(x,y) 表示添加文本的起始坐标位置;
-
text:字符串格式,要添加的文本内容;
-
font:ImageFont 对象;
-
fill:文本填充颜色。
第十八章节:Pilow 图像绘制
from PIL import Image, ImageDraw, ImageFont
im = Image.new('RGB', (200, 200), color='gray')
创建 ImageDraw 对象
draw = ImageDraw.Draw(im)
以左上角为原点,绘制矩形。元组坐标序列表示矩形的位置、大小;fill设置填充色为红色,outline设置边框线为黑色
draw.rectangle((50, 100, 100, 150), fill=(255, 0, 0), outline=(0, 0, 0))
加载计算机本地字体文件
font = ImageFont.truetype('C:\Windows\Fonts\STHUPO.TTF', size=36)
在原图像上添加文本
draw.text(xy=(80, 50), text='字体文本', fill=(255, 0, 0), font=font)
查看原图片
im.show()
保存图片
im.save('img/17.png')
Pillow和ndarray数组
NumPy 是 Python 科学计算的基础数据包,它被大量的应用于机器学习领域,比如图像识别、自然语言处理、数据挖掘等。
ndarray 是 NumPy 中的数组类型,也称为 ndarray 数组,该数组可以与 Pillow 的 PIL.Image 对象实现相互转化。
ndarray数组创建图像
下面通过 ndarray 数组构建一个 Image 对象,并将图像显示出来。示例如下:
from PIL import Image
import numpy as np
# 创建 300*400的图像,3个颜色通道
array = np.zeros([300, 400, 3], dtype=np.uint8)
# rgb色彩模式
array[:, :200] = [255, 0, 0]
array[:, 200:] = [255, 255, 0]
img = Image.fromarray(array)
img.show()
图像转化为ndarray数组
下面将图像以 ndarray 数组的形式进行输出,示例如下:
from PIL import Image
import numpy as np
img = Image.open("img/1.png")
img.show()
# Image图像转换为ndarray数组
img_2 = np.array(img)
print(img_2)
# ndarray转换为Image图像
arr_img = Image.fromarray(img_2)
# 显示图片
arr_img.show()
Pillow 读取图像资源总结
-
基本模式
from PIL import Image
with Image.open("图片相对/绝对路径地址") as im: -
读取来源于open图像资源
from PIL import Image
with open("图像相对/绝对路径地址", "rb") as fp:
im = Image.open(fp) -
读取二进制图像资源
from PIL import Image
import ioim = Image.open(io.BytesIO(buffer))
-
读取基于图像URL地址
from PIL import Image
from urllib.request import urlopen
url = "https://python-pillow.org/assets/images/pillow-logo.png" # 图片URL地址
img = Image.open(urlopen(url)) -
读取压缩文件
from PIL import Image, TarIO
fp = TarIO.TarIO("压缩包相对/绝对路径地址", "解压图像资源名称")
im = Image.open(fp)
Pillow批量处理
import glob
from PIL import Image
def compress_image(source_path, dest_path):
with Image.open(source_path) as img:
if img.mode != "RGB":
img = img.convert("RGB")
img.save(dest_path, "JPEG", optimize=True, quality=80)
paths = glob.glob("*.png")
for path in paths:
compress_image(path, path[:-4] + ".jpg")