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.
廣告