Python Pillow - 处理 Alpha 通道



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

以下是具有不同透明度级别的图像的视觉表示 -

working_with_alpha_channels_intro

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

RGBA 模式

  • 具有 Alpha 通道的图像通常以RGBA模式表示。

  • RGBA图像中的每个像素都有四个组件,即红色、绿色、蓝色和 Alpha。

透明度级别

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

  • 0表示完全透明,即完全透明或不可见。

  • 255表示完全不透明,即完全不透明或不可见。

访问 Alpha 通道

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

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

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

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

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

其中,

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

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

示例

在此示例中,我们使用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()

将要使用的输入 RGBA 图像

colordots.jpg

输出 Alpha 通道

splited_image_a

创建具有 Alpha 通道的图像

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

示例

在此示例中,我们将使用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

修改 Alpha 通道

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

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

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

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

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

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

示例

在此示例中,我们使用 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 jpg

输出修改后的图像

modified_alpha jpg

注意

  • putpixel() 函数直接修改内存中的图像。它对于对单个像素进行少量修改很有用。

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

使用 Alpha 通道合成图像

Image.alpha_composite()函数用于合成两张具有 Alpha 通道的图像。此函数根据其 Alpha 通道混合图像。

示例

在此示例中,我们使用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 jpg tp_logo jpg

输出 Alpha 合成图像 -

composite_image jpg

保存具有 Alpha 通道的图像

为了保留透明度,请以支持 Alpha 通道的格式(如 PNG)保存图像。JPEG 等格式不支持 Alpha 通道,并将丢弃透明度信息。我们可以使用 Pillow 中提供的save()函数。

示例

在此示例中,我们使用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.
广告