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

1.1. 操作图像

如果你有一台数码相机,或者只是将照片从手机上传 到 Facebook,你可能随时都会偶然遇到数字图像文件。你 可能知道如何使用基本的图形软件,如 Microsoft PaintPaintbrush,甚至更高级的应用程序,如 Adobe Photoshop 。 但是,如果需要编辑大量的图像,手工编辑可能是漫长、 枯燥的工作。

请用 PythonPillow 是一个第三方 Python 模块, 用于处理图像文件。该模块包含一些函数,可以很容易地裁剪图像、 调整图像大小,以及编辑图像的内容。可以像 Microsoft PaintAdobe Photoshop一样处理图像,有了这种能力,Python 可以轻松地自动编辑成千上万的图像。

1.1.1. 计算机图像基础

为了处理图像,你需要了解计算机如何处理图像中的顔色和坐标的基本知识, 以及如何在 Pillow 中处理颜色和坐标。但在继续探讨之前, 先要安装 pillow 模块。安装第三方模块请见附录 A

1.1.2. 颜色和RGBA

计算机程序通常将图像中的颜色表示为 RGBA 值。 RGBA 值是 一组数字,指定顔色中的红、绿、蓝和 alpha (透明度)的值。 这些值是从0(根本没有)到255 (最高)的整数。这些 RGBA 值分配 给单个像素,像素是计算机屏幕上能显示一种颜色的最小点(你可以想到, 屏幕上有几百万像素)。像素的 RGB 设置准确地告诉它应该显示哪种 颜色的色彩。图像也有一个 alpha 值,用于生成 RGBA 值。 如果图像显示在屏幕上,遮住了背景图像或桌面墙纸, alpha 值 决定了“透过”这个图像的象素,你可以看到多少背景。

Pillow 中, RGBA 值表示为四个整数值的元组。例如, 红色表示为(255,0, 0,255)。这种颜色中红的值为最大,没有绿和蓝, 并且 alpha 值最大,这意味着它完全不透明。绿色表本为 (0,255,0,255),蓝色是(0,0,255,255)。白色是各种颜色的组合, 即(255, 255,255, 255),而黑色没有任何颜色,是(0, 0, 0, 255)。

如果颜色的 alpha 值为0,不论 RGB 值是什么,该颜色是 不可见的。毕竟,不可见的红色看起来就像不可见的黑色一样。

Pillow 使用了HTML使用的标准颜色名称。表17-1 列出了一些标准颜色的名称和值。

表17-1 标准颜色名称及其RGB值

名称

RGBA 值

名称

RGBA 值

White

(255,255,255, 255)

Red

(255, 0, 0, 255)

Green

(0, 128, 0, 255)

Blue

(0, 0, 255, 255)

Gray

(128, 128, 128, 255)

Yellow

(255, 255, 0, 255)

Black

((), (), (), 255)

Purple

(128, 0, 128, 255)

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

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

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

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

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

1.1.3. 坐标和 Box 元组

图像像素用X和y坐标指定,分别指定像素在图像中的水平和 垂直位置。原点是位于图像左上角的像素,用符号(0,0)指定。 第一个0表示 x 坐标,它以原点处为0,从左至右增加。 第二个0表示 y 坐标,它以原点处为0,从上至下增加。 这值得重复一下: y 坐标向下走增加,你可能还记得 数学课上使用的 y 坐标,与此相反。图17-1展示了 这个坐标系统的工作方式。

CMYK 和 RGB着色

上小学时你学过,混合红、黄、蓝三种顔料可以得到其他颜色。 例如,可以混合蓝色和黄色,得到绿色顔料。这就是所谓的减色 模型,它适用于染料、油墨和颜料。这就是为什么彩色打印机有 的CMYK墨盒:青色(蓝色)、品红色(红色)、黄色和黑色墨水 可以混合在一起,形成任何颜色。

然而,光的物理使用所谓的加色模型。如果组合光 (例如由计算机屏幕发出的光),红、绿和蓝光可以 组合形成其他颜色。这就是为什么在计算机程序中使 用 RGB 值表示颜色。

许多 Pillow 函数和方法需要一个矩形元组参数。 这意味着 Pillow 需要一个四个整坐标的元组, 表示图像中的一个矩形区域。四个整数按顺序分别是:

  • 左:该矩形的最左边的 x 坐标。

  • 顶:该矩形的顶边的 y 坐标。

  • 右:该矩形的最右边右面一个像素的x坐标。 此整数必须比左边整数大。

  • 底:该矩形的底边下面一个像素的 y 坐标。 此整数必须比顶边整数大。

注意,该矩形包括左和顶坐标,直到但不包括右和底坐标。 例如,矩形元组(3,1,9, 6)表示图17-2中黑色矩形的所有像素。

_images/imga_2.jpg

图 17-2 由矩形元组(3, 1,9,6)表示的区域