CodeGym /課程 /Python SELF TW /處理 alpha 通道和透明度

處理 alpha 通道和透明度

Python SELF TW
等級 46 , 課堂 1
開放

1. 創建具有 alpha 通道的圖像

RGBA 格式(Red, Green, Blue, Alpha)是標準 RGB 格式的擴展,包含 alpha 通道來控制透明度。使用這種格式的圖像可以實現透明效果。

加載具有 alpha 通道的圖像

當加載支持透明度的 PNG 圖像時,Pillow 會自動識別 alpha 通道。


from PIL import Image

# 打開具有 alpha 通道的圖像
image = Image.open("transparent_image.png")
print(image.mode)  # 對於具有 alpha 通道的圖像,應輸出 'RGBA'

如果圖像已包含 alpha 通道,它將以 RGBA 格式打開。如果沒有,可以通過 convert() 方法進行轉換。

將圖像轉換為 RGBA 格式

如果圖像沒有 alpha 通道,可以將其轉換為 RGBA 模式來添加 alpha 通道。


# 將圖像轉換為 RGBA 格式
image = image.convert("RGBA")

2. 創建透明背景

有時需要創建具有完全透明背景的圖像,以便進行繪製或添加其他元素。為此可以創建具有 RGBA 模式的新圖像,並填充完全透明的顏色。


# 創建具有透明背景的圖像
transparent_image = Image.new("RGBA", (500, 500), (255, 255, 255, 0))
transparent_image.save("transparent_background.png")

此示例創建了一個 500x500 像素的透明背景圖像。顏色 (255, 255, 255, 0) 表示白色,其中 alpha 值為 0(完全透明)。

3. 對圖像應用透明度

有時需要調整整個圖像的透明度,可以用 putalpha() 方法來控制每個像素的透明度。

設置圖像的透明度級別

putalpha() 方法允許設置整個圖像的透明度。Alpha 通道的值範圍為 0(完全透明)到 255(完全不透明)。


# 為整個圖像設置透明度級別
image.putalpha(128)  # 設置為半透明
image.save("semi_transparent_image.png")

該代碼將圖像設置為半透明,其 alpha 通道值為 128(255 的一半)。

4. 使用遮罩應用透明度

遮罩是一種黑白圖像,其中白色區域(值 255)完全可見,黑色區域(值 0)完全透明。從 0 到 255 的值將創建透明度漸變。

為圖像應用遮罩


# 加載圖像和遮罩
image = Image.open("foreground.png").convert("RGBA")
mask = Image.open("mask.png").convert("L")  # 灰度模式的遮罩

# 使用遮罩應用透明度
image.putalpha(mask)
image.save("masked_image.png")

此示例將遮罩 mask.png 應用於圖像 foreground.png。遮罩的白色區域使圖像完全可見,黑色區域變得透明,而灰色區域呈現半透明效果。

5. 帶透明度的圖像疊加

Pillow 可以將一個圖像疊加到另一個圖像上,並考慮 alpha 通道。這對於創建疊加效果和圖像合成非常有用。

將一幅圖像疊加到另一幅圖像

假設我們有一個背景圖像和一個具有透明區域的圖像,想將其疊加到背景上。


# 加載背景圖像和欲疊加的圖像
background = Image.open("background.jpg").convert("RGBA")
overlay = Image.open("overlay.png").convert("RGBA")

# 在座標 (50, 50) 上疊加 overlay 到 background
background.paste(overlay, (50, 50), overlay)

# 保存結果
background.save("overlay_result.png")

此處 overlay 是具有透明度的圖像,疊加到 background 上的座標 (50, 50)。通過將遮罩作為第三個參數傳遞給 paste() 方法,可以在疊加時考慮透明區域。

6. 精細控制 alpha 通道

想要對單個像素的透明度進行更細微的控制,可以使用 putpixel()getpixel() 方法,這些方法允許更改單個像素的透明度。

示例:更改單個像素的透明度


# 在 RGBA 模式中打開圖像
image = Image.open("example.png").convert("RGBA")

# 更改圖像上部像素的透明度
width, height = image.size
for x in range(width):
    for y in range(int(height / 2)):  # 上半部分
        r, g, b, a = image.getpixel((x, y))
        image.putpixel((x, y), (r, g, b, int(a * 0.5)))  # 半透明像素

image.save("pixel_transparency_example.png")

該代碼將圖像的上半部分設為半透明。我們使用 getpixel() 獲取每個像素的顏色值,隨後修改 alpha 通道,並通過 putpixel() 將更新後的像素寫回。

7. 示例

完整處理 alpha 通道和透明度的示例

讓我們結合所有方法,創建一個具有透明背景的圖像,並在其上疊加文字和半透明的圖形元素。


from PIL import Image, ImageDraw, ImageFont

# 創建具有透明背景的圖像
image = Image.new("RGBA", (500, 500), (255, 255, 255, 0))
draw = ImageDraw.Draw(image)

# 繪製半透明的矩形
draw.rectangle((50, 50, 450, 150), fill=(255, 0, 0, 128))  # 紅色 50% 透明

# 繪製半透明的圓形
draw.ellipse((50, 200, 450, 400), fill=(0, 0, 255, 128))  # 藍色 50% 透明

# 添加具有透明度的文字
font = ImageFont.truetype("arial.ttf", 36)
draw.text((100, 50), "Hello, World!", font=font, fill=(255, 255, 255, 128))

# 保存結果
image.save("alpha_channel_example.png")

此示例創建了一個具有透明背景的圖像,包含一個半透明的紅色矩形、一個藍色圓形和帶半透明效果的文字。這種方法對於創建專業設計的圖像特別有用途,帶有與背景元素融合的圖形。

透明度和 alpha 通道的實際應用

  1. 創建標誌和浮水印:alpha 通道允許將標誌和浮水印設置為半透明,這樣既不顯眼又足夠清晰。
  2. 介面設計:透明元素經常用於疊加和按鍵設計。
  3. 拼貼和合成:處理透明度可以創建複雜的合成,讓圖像能夠平滑地彼此結合。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION