Image类简介
Image模块是Pillow库的核心部分。它是用来存储所有类型的图像的主类,它还包含大量的函数方法,用于以各种方式处理图像。
Image 类的重要功能:
创建图像。
保存图像。
图像生成器。
图像带
图像属性和统计。
像素访问 - 如何有效地读写像素。
与其他库集成 - 如何有效地交换图像数据。
图像操作(旋转、转置等
图像合成(混合等)
图像过滤(过滤功能)
Image模块还包含添加扩展的功能,例如,处理某些图像格式的特殊编码方案。这是一个非常专业的领域,扩展通常是用C语言编写。
创建图像
Image.new
Image.open
open也接受一个格式参数。
boat_image = Image.open("boat-small.jpg", formats=['PNG', 'JPEG'])
open通常会尝试打开任何支持格式的图像文件,但如果你提供了一个格式列表,它将只尝试打开这些格式的图像。如果你想避免意外地打开一些晦涩难懂的格式,而这些格式可能有你的应用程序不支持的功能,这就很有用。
open通过检查文件来确定文件的类型。它不关注文件的扩展名。因此,举例来说,如果一个PNG文件被意外地以.jpg为扩展名保存,上面的代码将毫无错误地打开PNG文件。
这段代码只允许JPEG图像。
boat_image = Image.open("boat-small.jpg", formats=['JPEG'])
如果该文件真的是JPEG文件,这段代码将打开该文件,但如果该文件是其他格式,则会引发错误。
你也可以提供读取模式下打开的文件对象,而不是文件名。
copy
copy方法创建图像的新副本。
image2 = image.copy()
其他方法
你可以从数据中创建图像,以内存数组的形式(比如NumPy数组),你可以使用fromarray, frombuffer, 或frombytes方法从数据中创建图像。
保存图像
你可以使用save方法来保存图像,像这样。
image.save('boat.png')
该函数将使用文件扩展名来决定使用哪种文件格式,所以在上面的例子中它将创建一个PNG文件。
你可以指定一种格式。
image.save('boat.png', format=PNG)
这将以PNG格式存储图像,而不管文件扩展名是什么。如果你想用非标准的扩展名来存储图像(例如.dat而不是.png),这很有用。
除了文件名,你也可以提供以写模式打开的文件对象。在这种情况下,你应该提供格式参数,因为Pillow不知道目标文件名。
图像生成器
Pillow自带了一些随机图像生成器函数。
除了effect_mandelbro,effect_noise生成噪声图像。
noise = Image.effect_noise(size=(256, 256), sigma=32)
图像大小为256×256像素,图像被填充高斯噪声,根据高斯分布将每个像素设置为0到255之间的随机值,以128为中心。西格玛值控制着数值的分散程度。
linear_gradient创建从0到255(黑到白)的梯度图像。图像大小固定为256像素的正方形,所以唯一的参数是模式。它必须是一个灰度模式,所以明显的选择是'L'。你也可以使用'P'来创建一个基于调色板的灰度图像。
image = Image.linear_gradient('L')
radial_gradient可以用来创建径向梯度。
image = Image.radial_gradient('L')
处理图像带
在RGB图像中,每个像素都包含红色、绿色和蓝色分量。在Pillow中,这些分量被称为带。
getbands
getbands方法返回包含图像中每个带的单字母名称的元组。
bands = image.getbands()
对于一个RGB图像,该函数返回('R', 'G', 'B')。对于RGBA图像,它返回('R', 'G', 'B', 'A'),以此类推。
分割
split方法将图像分割成多个图像,每个图像包含原图像的一个频段。
red_image, green_image, blue_image = image.split()
原始图像被分割成3个部分。red_image是一个灰度图像,只包含图像的红色部分,green_image和blue_image的情况类似。
在这个图像中,暗区是图像中含有很少红色的部分,亮区是图像中含有大量红色的部分。
merge
merge功能的作用与分割相反。它取几个单频带图像,并将其合并形成彩色图像。
mixed_image = Image.merge('RGB', [red_image, green_image, blue_image])
上面的代码合并了我们之前创建的三个波段,所以它将产生与原始图像相同的图像。
blank = Image.new('L', image.size)
red_sep = Image.merge('RGB', [red_image, blank, blank])
red_sep.save('red_sep.png')
getchannel
如果你只想要波段,getchannel也可以。
red_image = image.getchannel('R')
波段可以通过名称(如'R'、'G'、'B',因为它们出现在getbands中)或索引号(0、1、2...)来识别。
putalpha
putalpha方法可以用来给图像添加alpha带(或者替换当前的alpha带,如果已经有)。这是一个为现有图像添加透明度的好方法。
在这个例子中,我们将使用一个渐变色(radial gradient)作为我们的alpha通道。
以下是将这个图像作为alpha通道应用到船形图像的代码。
vignette_image = Image.open('vignette.png').getchannel(0)
image.putalpha(vignette_image)
vignette图像是一个RGB图像,但我们需要单波段的图像作为putalpha。这没有问题,我们可以简单地使用getchannel(0)来提取第一个波段。
putalpha将渐变体作为alpha通道添加到图像中。这就把图像从RGB转换为RGBA。这里是结果的图像。
图像的边缘渐渐消失了--这是因为它越来越透明,所以白页显示出来了。
参考资料
- 本文涉及的python测试开发库 谢谢点赞!
- 本文相关海量书籍下载