Pillow图片格式转换

图片格式之间的转换主要有以下两种方法:

save() 方法用于保存图像,当不指定文件格式时,它会以默认的图片格式来存储;如果指定图片格式,则会以指定的格式存储图片。

save() 的语法格式如下:

Image.save(fp, format=None)

fp:图片的存储路径,要声明图片的名字和格式;
format:可选参数,可以指定图片的格式。

1
2
3
from PIL import Image
img = Image.open("D:\\File\\All\\web\\python\\blog\\947849.jpg")
img.save("D:\\File\\All\\web\\python\\blog\\949.jpg")

convert()+save()注意,并非所有的图片格式都可以用 save() 方法转换完成,
比如将 PNG 格式的图片保存为 JPG 格式,如果直接使用 save() 方法就会出现以下错误:

引发错误的原因是由于 PNG 和 JPG 图像模式不一致导致的。
其中 PNG 是四通道 RGBA 模式,即红色、绿色、蓝色、Alpha 透明色;
JPG 是三通道 RGB 模式。因此要想实现图片格式的转换,就要将 PNG 转变为三通道 RGB 模式。
Image 类提供的 convert() 方法可以实现图像模式的转换。该函数提供了多个参数,比如 mode、matrix、dither 等,其中最关键的参数是 mode,其余参数无须关心。语法格式如下:
convert(mode)
mode:指的是要转换成的图像模式
params:其他可选参数。

1
2
3
4
from PIL import Image
img = Image.open("D:\\File\\All\\web\\python\\blog\\947849.jpg")
im= img.convert("RGBA")
im.save("D:\\File\\All\\web\\python\\blog\\99.png")

covert() 会返回一个新的 image 对象

Pillow图像缩放操作

Image 类提供的 resize() 方法能够实现任意缩小和放大图像。
resize() 函数的语法格式如下:

resize(size, resample=image.BICUBIC, box=None,
reducing_gap=None) 一般使用就用第一个参数比较常见

size:元组参数 (width,height),图片缩放后的尺寸;一般表示大小的基本上都是元组参数

resample:可选参数,指图像重采样滤波器,与 thumbnail() 的 resample 参数类似,默认为 Image.BICUBIC;

box:对指定图片区域进行缩放,box 的参数值是长度为 4 的像素坐标元组,即 (左,上,右,下)。
注意,被指定的区域必须在原图的范围内,如果超出范围就会报错。当不传该参数时,默认对整个原图进行缩放;

reducing_gap:可选参数,浮点参数值,用于优化图片的缩放效果,常用参数值有 3.0 和 5.0。

注意,resize() 会返回一个新的 image 对象

1
2
3
4
5
from PIL import Image
img = Image.open("D:\\File\\All\\web\\python\\blog\\947849.jpg")
im=img.resize((900,900))
# im.save("D:\\File\\All\\web\\python\\blog\\49.jpg")
im.show()

对图片的局部位置进行放大,示例如下:

1
2
3
4
5
from PIL import Image
img = Image.open("D:\\File\\All\\web\\python\\blog\\947849.jpg")
im=img.resize((100,100),box=(0,0,120,120))
# im.save("D:\\File\\All\\web\\python\\blog\\49.jpg")
im.show()

​ 实际使用时局部放大用的非常少

创建缩略图缩略图

(thumbnail image)指的是将原图缩小至一个指定大小(size)的图像。通过创建缩略图可以使图像更易于展示和浏览。Image 对象提供了一个 thumbnail() 方法用来生图像的缩略图,该函数的语法格式如下:

thumbnail(size,resample)

size:元组参数,指的是缩小后的图像大小;

resample:可选参数,指图像重采样滤波器,有四种过滤方式,分别是 Image.BICUBIC(双立方插值法)、PIL.Image.NEAREST(最近邻插值法)、PIL.Image.BILINEAR(双线性插值法)、PIL.Image.LANCZOS(下采样过滤插值法),默认为 Image.BICUBIC。

1
2
3
4
5
from PIL import Image
im = Image.open("D:\\File\\All\\web\\python\\blog\\947849.jpg")
im.thumbnail((150,50))
# im.save("D:\\File\\All\\web\\python\\blog\\49.jpg")
im.show()

注意,缩略图的尺寸可能与您指定的尺寸不一致,这是因为 Pillow 会对原图像的长、宽进行等比例缩小,当指定的尺寸不符合图像的尺寸规格时,缩略图就会创建失败, 比如指定的尺寸超出了原图像的尺寸规格

批量修改图片尺寸

采用批量处理方法,比如批量转换格式,批量修改尺寸,批量添加水印,批量创建缩略图等,这是一种提升工作效率的有效途径,它避免了单一、重复的操作。通过 Pillow 提供的 Image.resize() 方法可以批量地修改图片尺寸,下面看一组简单的示例。首先找一些类型相同,但尺寸不一的图片,并把它们放入桌面的 image01 文件夹中

批量修改图片尺寸

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import os
from PIL import Image
#读取图片目录
fileName = os.listdir('C:/Users/Administrator/Desktop/image01/')
print(fileName)
#设定尺寸
width = 350
height = 350
#如果目录不存在,则创建目录
if not os.path.exists('C:/Users/Administrator/Desktop/NewImage/'):
os.mkdir('C:/Users/Administrator/Desktop/NewImage/')
#循环读取每一张图片
for img in fileName:
old_pic = Image.open('C:/Users/Administrator/Desktop/image01/' + img)
new_image = old_pic.resize((width, height),Image.BILINEAR)
print (new_image)
new_image.save('C:/Users/Administrator/Desktop/NewImage/'+img)

这里原理其实非常简单 ,即使需要大家对文件的下官操作非常熟悉