>>> 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 Paint
或
Paintbrush
,甚至更高级的应用程序,如 Adobe Photoshop
。
但是,如果需要编辑大量的图像,手工编辑可能是漫长、 枯燥的工作。
请用 Python
。 Pillow
是一个第三方 Python
模块,
用于处理图像文件。该模块包含一些函数,可以很容易地裁剪图像、
调整图像大小,以及编辑图像的内容。可以像 Microsoft Paint
或
Adobe 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中黑色矩形的所有像素。
图 17-2 由矩形元组(3, 1,9,6)表示的区域