Pillow 一文读懂

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 imtry:# 合并图片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.sizedelta = delta % xsizeif delta == 0:return impart1 = 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 imgtry:# 打开图片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 placeim.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 100mask = source[R].point(lambda i: i < 100 and 255)# process the green bandout = source[G].point(lambda i: i * 0.7)# paste the processed band back, but only where red was < 100source[G].paste(out, None, mask)# build a new multiband imageim = 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 Imagewith Image.open("animation.gif") as im:im.seek(1)  # skip to the second frametry:while 1:im.seek(im.tell() + 1)# do something to imexcept 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 = imdef __getitem__(self, ix):try:if ix:self.im.seek(ix)return self.imexcept EOFError:raise IndexError # end of sequencefor frame in ImageSequence(im):# ...do something to frame...

Pillow 图片添加水印

ImageDraw

PIL.ImageDraw 模块提供了一系列的绘图方法,通过该模块可以创建一个新的图形,或者在现有的图像上再绘制一个图形,从而起到对原图注释和修饰的作用。

下面创建一个 ImageDraw 对象,并对该对象的使用方法做简单介绍:

draw = ImageDraw.Draw(im)

上述方法会返回一个 ImageDraw 对象,参数 im 表示 Image 对象。这里我们可以把 Image 对象理解成画布,通过调用 ImageDraw 对象的一些方法,实现了在画布上绘制出新的图形目的。ImageDraw 对象的常用方法如下表所示:

ImageDraw常用方法
方法说明
text在图像上绘制文字
line绘制直线、线段
eclipse绘制椭圆形
rectangle绘制矩形
polygon绘制多边形
# 第十七章节: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, ImageFontim = 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 Imagewith 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, TarIOfp = TarIO.TarIO("压缩包相对/绝对路径地址", "解压图像资源名称")
im = Image.open(fp)

Pillow批量处理

import glob
from PIL import Imagedef 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")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/767449.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IPV6协议之RIPNG

目录 前言&#xff1a; 一、RIPNG与RIP的区别 二、如何配置RIPNG 如何解决RIPNG环路问题呢&#xff1f; 控制RIPNG的选路 1、修改RIPNG默认优先级 2.配置接口附加开销值从而干涉RIPNG的选路 RIPNG拓展配置 1.RIPNG的认证 配置RIPNG进程下的IPsec认证&#xff1a; 配…

C++默认构造函数(二)

目录 构造函数补充 构造函数初始化列表的使用 赋值运算符重载函数 运算符重载函数介绍 运算符重载函数的使用 赋值运算符重载函数 赋值运算符重载函数的使用 拷贝构造函数和赋值运算符重载函数 重载前置和后置 前置 后置 重载流插入<<与流提取>> 流插…

Navicat 干货 | 探索 PostgreSQL 的外部数据包装器和统计函数

PostgreSQL 因其稳定性和可扩展性而广受青睐&#xff0c;为开发人员和数据管理员提供了许多有用的函数。在这些函数中&#xff0c;file_fdw_handler、file_fdw_validator、pg_stat_statements、pg_stat_statements_info 以及 pg_stat_statements_reset 是其中的重要函数&#x…

白学的小知识[js.事件]

一、事件的常用绑定方式 1 、行内绑定&#xff0c;语法&#xff1a; <标签 属性列表 事件"事件处理的程序" /> <button onclick"addNode();">创建节点</button> 行内绑定&#xff1a;行内绑定的方式所有的行为&#xff08;结构、样式、…

C语言:htoi十六进制转十进制

编写函数htoi(s), 把由十六进制数字组成的字符串&#xff08;包含可选的前缀0X和0x&#xff09;&#xff0c;转化为与之等价的整数值, 字符串中包含的字符可以是0 - 9&#xff0c;A - F&#xff0c;a - f // 把由十六进制数字组成的字符串(包含可选的前缀0X和0x)&#xff0c;转…

鸿蒙:@Observed装饰器和@ObjectLink装饰器:嵌套类对象属性变化

在实际应用开发中&#xff0c;应用会根据开发需要&#xff0c;封装自己的数据模型。对于多层嵌套的情况&#xff0c;比如二维数组&#xff0c;或者数组项class&#xff0c;或者class的属性是class&#xff0c;他们的第二层的属性变化是无法观察到的。这就引出了Observed/Object…

AJAX介绍使用案例

文章目录 一、AJAX概念二、AJAX快速入门1、编写AjaxServlet&#xff0c;并使用response输出字符&#xff08;后台代码&#xff09;2、创建XMLHttpRequest对象&#xff1a;用于和服务器交换数据 & 3、向服务器发送请求 & 4、获取服务器响应数据 三、案例-验证用户是否存…

由浅入深一步步了解什么是哈希(概念向)

文章目录 什么是哈希哈希函数直接定址法除留余数法 哈希冲突闭散列线性探测法二次探测法负载因子和闭散列的扩容 开散列开散列的扩容 非整形关键码 什么是哈希 我们来重新认识一下数据查找的过程&#xff1a; 在顺序结构以及平衡树中&#xff0c;记录的关键码与其存储位置之间…

【自然语言处理】统计中文分词技术(一):1、分词与频度统计

文章目录 一、词与分词1、词 vs 词素2、世界语言分类 二、分词的原因与基本原因1、为什么要分词2、分词规范3、分词的主要难点-切分歧义如何排除切分歧义利用词法信息利用句法信息利用语义信息利用语用、语境信息 4、分词的主要难点-未登录词未登录词如何识别未登录词 三、分词…

扫雷(c++题解)

题目描述 题目描述 扫雷是一种计算机游戏&#xff0c;在 世纪 年代开始流行&#xff0c;并且仍然包含在某些版本的 Microsoft Windows 操作系统中。 在这个问题中&#xff0c;你正在一个矩形网格上玩扫雷游戏。 最初网格内的所有单元格都呈未打开状态。 其中 个不同的单…

Docker入门到实践之环境配置

Docker入门到实践之环境配置 docker 环境安装 Ubuntu/Debian: sudo apt update sudo apt install docker.ioCentOS/RHEL: sudo yum install dockerArch Linux: sudo pacman -S docker如果未安装成功&#xff0c;或者env的path未设置成功&#xff0c;运行时会报错 Bash: Do…

[HackMyVM]靶场 Slowman

kali:192.168.56.104 靶机:192.168.56.132 端口扫描 # nmap 192.168.56.132 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-03-24 15:28 CST Nmap scan report for 192.168.56.132 Host is up (0.00066s latency). Not shown: 995 filtered tcp ports (no-response) …

NX二次开发-调内部函数创建进度条MT_create_progress_bar

一、概述 最近学习NX二次开发&#xff0c;看到NX打开装配模型或者加载模型时会显示进度条的问题&#xff0c;个人觉得很有意思&#xff0c;然后参考阿飞2018中的文章进行学习。 二、代码解析 //User Defined Header File#include <uf.h>#include <uf_ui.h>#includ…

使用 React antd 的ProFormSelect组件 搜索查询 多选的写法

使用 React antd 的ProFormSelect组件 搜索查询 多选的写法 需求&#xff1a;需要一个搜索框&#xff0c;可以选择员工&#xff0c;&#xff08;员工人数多无法一次性获取&#xff0c;全部放入options中&#xff09;&#xff0c;所以需要使用搜索功能&#xff0c;而且是可以多…

redis如何保持持久性

为了保持 Redis 数据的持久性&#xff0c;你可以通过以下几种方式来实现&#xff1a; RDB 持久化&#xff1a; Redis 可以将数据集快照写入磁盘。此方法会在指定的时间间隔内生成数据集的时间点快照&#xff0c;存储到磁盘上。这种持久化方式适用于备份、恢复数据以及灾难恢复…

Linux的相关指令总结

Linux的基本命令 Linux指令是Linux操作系统的核心组成部分&#xff0c;它们为用户和管理员提供了与系统进行交互和管理的强大工具。这些指令涵盖了从基本的文件操作到复杂的系统配置和管理的各个方面。 ls指令 功能&#xff1a;用于列出指定目录中的文件和子目录名称。语法&am…

HarmonyOS NEXT应用开发之ArkWeb同层渲染

介绍 该方案展示了ArkWeb同层渲染&#xff1a;将系统原生组件直接渲染到前端H5页面上&#xff0c;原生组件不仅可以提供H5组件无法实现的一些功能&#xff0c;还能提升用户体验的流畅度 效果图预览 使用说明 进入页面即可看到同层渲染效果&#xff0c;Text&#xff0c;searc…

js知识总结

1. JS由那三部分组成&#xff1f; ECMASript文档对象模型&#xff08;DOM&#xff09;浏览器对象模型&#xff08;BOM&#xff09; 2. 操作数组的方法有那些&#xff1f; 高阶函数&#xff1a;map、filter、forEach、reduce、find、findIndex、every、some、push、unshift、…

数据库系统概论(超详解!!!) 第四节 关系数据库标准语言SQL(Ⅰ)

1.SQL概述 SQL&#xff08;Structured Query Language&#xff09;结构化查询语言&#xff0c;是关系数据库的标准语言 SQL是一个通用的、功能极强的关系数据库语言 SQL的动词 基本概念 基本表 &#xff1a;本身独立存在的表&#xff1b; SQL中一个关系就对应一个基本表&am…

SecureCRT:高效安全的远程连接工具

SecureCRT是一款功能强大的终端仿真工具&#xff0c;主要用于连接和运行包括Windows、UNIX和VMS在内的远程系统。它支持多种协议&#xff0c;如SSH1、SSH2、Telnet、SFTP、Rlogin、Serial、SCP等&#xff0c;确保用户与目标设备之间的通信安全&#xff0c;并防止网络攻击和窥探…