Python Pillow 简明教程

Python Pillow - Working with Alpha Channels

图像中的阿尔法通道是一个分量,表示每个像素的透明度或不透明度级别。它通常用于 RGBA 图像,其中每个像素由其红色、绿色、蓝色和阿尔法值定义。此通道确定多少背景通过图像显示。简单来说,我们可以说阿尔法值为 0 的像素完全透明,而阿尔法值为 255 的像素完全不透明。

以下是具有不同透明度级别的图像的可视化表示 −

images\working with alpha channels intro

以下是与 Pillow 中的 Alpha 通道相关的关键概念的细分 −

RGBA Mode

  1. 具有 alpha 通道的图像通常以 RGBA 模式表示。

  2. RGBA 图像中的每个像素有四个分量,即红色、绿色、蓝色和 Alpha。

Transparency Levels

  1. Alpha 通道值通常在 0 到 255 之间。

  2. 0 表示完全透明,即完全可透视或不可见。

  3. 255 表示完全不透明,即完全不透视或不可透视。

Accessing Alpha Channel

我们可以使用 Pillow Image 模块的 split() 函数来访问 Alpha 通道。此函数用于分离图像的各个颜色通道。它通过允许我们分别访问和操作各个通道,将图像分解为其组成通道。

使用 split() 函数分割通道提供了单独处理和操作各个颜色或 Alpha 通道的灵活性,从而实现精确的图像调整和处理。

对图像对象调用 split() 函数时,它将返回一个单独的通道图像元组。对于 RGBA 图像,元组包括红色、绿色、蓝色和 Alpha 通道。对于灰度或单通道图像,split() 函数仍然返回同一个通道的四个相同副本。通过专门访问 Alpha 通道,你可以直接操作图像的透明度。

以下是 split() 函数的语法和参数 −

r,g,b,a = image.split()

其中,

  1. image − 这是使用 Image.open() 函数打开的图像对象。

  2. r, g, b, a − 这些变量接收分别代表红色、绿色、蓝色和 Alpha(即通道透明度)的单独波段。

Example

在此示例中,我们使用 split() 函数分割 Alpha 通道并访问它。

from PIL import Image

# Open an image
img_obj = Image.open('Images/colordots.png')

#Split the image into RGBA channels
red, green, blue, alpha = img_obj.split()

# Alpha (transparency) channel
alpha.show()
colordots
splited image a

Creating an Image with Alpha Channel

要创建具有 Alpha 通道的图像,我们可以使用 new() 函数。此函数提供模式、宽度、高度和 RGBA 值等选项以自定义图像。最后一个参数的最后一个值定义了图像的透明度,即 Alpha。

Example

在此示例中,我们将使用 new() 函数创建一个具有 Alpha 通道的图像。

from PIL import Image

# Create an RGBA image with Semi-transparent green
image = Image.new('RGBA', (700, 300), (10, 91, 51, 100))

# Display the resultant image with alpha channel
image.show()

执行上述程序后,你会得到类似以下内容的 RGBA 输出 −

image with alpha

Modifying Alpha Channels

可以使用 putpixel() 函数设置像素的各个 Alpha 值,以修改图像的 Alpha 通道。

Python Pillow 的 putpixel() 函数用于更改图像中特定位置单个像素的颜色。此函数允许我们通过提供坐标和所需颜色来直接修改特定像素的颜色。

以下是 putpixel() 函数的语法和参数。

image.putpixel((x, y), color)
  1. image − 这是使用 Image.open() 函数打开的图像对象。

  2. (x, y) − 这是我们想要设置颜色的像素坐标。x 表示水平位置,y 表示垂直位置。

  3. color − 我们想要分配给指定像素的颜色值。颜色值格式取决于图像模式。

Example

在此示例中,我们正在使用 Pillow 库的 putpixel() 函数修改给定输入图像的像素 Alpha 值。

from PIL import Image

# Open an image
image = Image.open("Images/colordots.png")
width, height = image.size

# Modify alpha values of pixels
for y in range(height):
    for x in range(width):
        r, g, b, a = image.getpixel((x, y))
        image.putpixel((x, y), (r, g, b, int(a * 0.5)))  # Reduce alpha by 50%

# Display the modified image
image.show()
colordots
modified alpha

Note

  1. putpixel() 函数直接修改内存中的图像。它对于对各个像素进行小修改非常有用。

  2. 对于大规模像素操作或更复杂的处理,我们必须考虑使用其它 Pillow 函数,这些函数针对更大的区域或整个图像来操作,以获得更好的性能。

Composite Images with Alpha Channel

Image.alpha_composite() 函数用于处理具有 alpha 通道的图像。此函数基于图像的 alpha 通道对图像进行混合。

Example

在这个示例中,我们正在使用 Image.alpha_composite() 函数基于图像的 alpha 通道对两幅图像进行混合。

from PIL import Image

# Open two images
img1 = Image.open('Images/tp_logo.png')
img2 = Image.open('Images/colordots_2.png')

# Composite the images
composite = Image.alpha_composite(img1, img2)

# Display the result
composite.show()
colordots 2
tp logo
composite image

Saving Images with Alpha Channel

若要保留透明度,请以支持 alpha 通道的格式(如 PNG)保存图像。JPEG 等格式不支持 alpha 通道,并且会丢弃透明度信息。我们可以在 Pillow 中使用 save() 函数。

Example

在这个示例中,我们正在使用 Image.save() 函数保存带有 alpha 通道的图像。

from PIL import Image

# Create a new image with alpha channel
new_img = Image.new('RGBA', (700, 300), (255, 0, 0, 128))

# Save the image with alpha channel
new_img.save("output Image/new_img.png", "PNG")
print("The image with alpha channel is saved.")

执行以上代码后,你会发现生成的 PNG 文件“new_img.png”已保存在当前工作目录中 −

The image with alpha channel is saved.