>>> from env_helper import info; info()
页面更新时间: 2024-04-06 23:01:28
运行环境:
    Linux发行版本: Debian GNU/Linux 12 (bookworm)
    操作系统内核: Linux-6.1.0-18-amd64-x86_64-with-glibc2.36
    Python版本: 3.11.2

3.2. 使用 Pillow 打开图像文件

Pillow 是 PIL 的替代版本。 由于PIL仅支持到Python 2.7,加上年久失修,于是一群志愿者在PIL的基础上创建了兼容的版本。 新版本的名字叫Pillow,支持最新的Python 3.x,并加入了许多新特性。

PIL 软件包提供了基本的图像处理功能,如:改变图像大小,旋转图像,图像格式转换,颜色空间转换,图像增强,直方图处理,插值和滤波等等。

安装Pillow 使用命令:

pip install pillow

可以直接安装,也可以使用 Anaconda 安装。

3.2.1. 交互查看图像

Image 是 Pillow 最常用的类,他可以通过多种方式创建图像实例。

导入 Image 模块。然后通过 Image 类中的 open 函数即可载入图像文件, open 函数会自动判断图片格式, 只需指定文件位置即可,open 函数返回一个 Image 对象; 载入文件失败,则会引起 IOError 异常 。

>>> from PIL import Image

注意,导入pillow模块用的是PIL,而不是pillow。

Pillow 提供 ImageColor.getcolor() 函数,所以你不必记住想用的顔色的 RGBA 值。 该函数接受一个颜色名称字符串作为第一个参数,字符串 'RGBA' 作为第二个参数, 返回一个 RGBA 元组。

要了解该函数的工作方式,就在交互式环境中输入以下代码:

>>> from PIL import ImageColor
>>> ImageColor.getcolor('red', 'RGBA')
>>>
>>> ImageColor.getcolor('RED', 'RGBA')
>>>
>>> ImageColor.getcolor('Black', 'RGBA')
>>>
>>> ImageColor.getcolor('chocolate', 'RGBA')
>>>
>>> ImageColor.getcolor('CornflowerBlue', 'RGBA')
(100, 149, 237, 255)

首先,你需要从 PIL 导入 ImageColor 模块 (不是从 Pillow ,稍后你就会明白为什么)。 传递给 ImageColor.getcolor() 的颜色名称字符串是不区分大小写的, 所以传入red 和传入 RED 将得到同样的 RGBA 元组。 还可以传递更多的不常见的颜色名称,如 chocolateCornflower Blue

Pillow 支持大量的颜色名称,从 aliceblue , 至 whitesmoke 。 在 http://nostarch.com/automatestuff/ 的资源中,可以找到超过100种标准颜色名称的完整列表。

>>> import matplotlib.pyplot as plt
>>> image = Image.open('L1020120.JPG')

matplotlib是一个专业绘图的库,它能让使用者很轻松地将数据图形化,并且提供多样化的输出格式。可以设置多个figure,设置figure的标题,更好的显示图像。

查看图像属性信息

>>> print(image.format, image.size, image.mode)
JPEG (1000, 734) RGB
  • format 图像格式

  • size 图像的 (宽,高) 元组

mode 常见模式,

  • 默认 RGB 真彩图像;

  • L 为灰阶图像;

  • CMYK 印刷色彩;

  • RGBA 带透明度的真彩图像;

  • YCbCr 彩色视频格式;

  • LABL * a * b 颜色空间;

  • HSV 等。

查看图片

>>> plt.imshow(image)
>>> plt.show()
_images/sec02_pillow_13_0.png

3.2.2. 修改文件格式

Image 模块中的 save 函数可以保存图片,除非你指定文件格式,否则文件的扩展名就是文件格式。

>>> image_path='L1020120.JPG'
>>> outfile = "./xx_img2_2.png"
>>>
>>> try:
>>>     Image.open(image_path).save(outfile)
>>> except IOError:
>>>     print("cannot convert", image_path)
>>> image=Image.open(outfile)
>>> print(image.format, image.size, image.mode)
PNG (1000, 734) RGB

save() 函数有两个参数,如果文件名没有指定图片格式,那么第二个参数是必须的,它指定图片的格式。

3.2.3. 创建缩略图

创建缩略图 使用 Image.thumbnail( size )

>>> image_path = 'L1020120.JPG'

size 为缩略图宽长元组。我们先准备好 size 的值。为了保证图片不失真变形,当指定了图片的宽和高时,pillow会以宽度为准进行缩小。

>>> size = (256, 256)
>>> outfile = "./xx_img1_1.png"
>>>
>>> im = Image.open(image_path)
>>> print(im.mode,im.size,im.format)
RGB (1000, 734) JPEG

使用 thumbnail() 方法,将size参数传入,将图片缩小为设置的尺寸。

>>> im.thumbnail(size)
>>> im.convert('RGB')
_images/sec02_pillow_21_0.png
>>> im.save(outfile)

如果上面的缩略图无法直接保存,需要进行模式的转换,不然会出现如下问题:

cannot write mode RGBA as JPEG
>>> img=Image.open(outfile)
>>> print(img.mode,img.size,img.format)
RGB (256, 188) PNG