Last Updated on 2021-10-13 by Clay
在進行圖片處理的過程中,很多時候我們會希望將圖片的背景轉為透明,使用 Python 當中的 PIL 模組可以輕易地辦到這一點,也可以客製化自己想要轉為透明背景的顏色,甚至可以指定區間來進行透明的轉換。
這是一個還滿常見、簡單的技巧,所以便隨手紀錄下來。
若是對 Python 當中 PIL 的相關使用方法有興趣,可以參考他們官方的教學: https://pillow.readthedocs.io/en/3.0.x/handbook/tutorial.html
將圖片的背景轉為透明
首先,假設我有一張這樣的圖片:
這是一張 JPG 格式的圖片,我們可以看到,大部分的背景都是白色。那麼以下,我們使用 PIL 這個模組來進行轉換的處理。
如果是第一次使用 PIL,要使用以下指令安裝:
pip3 install pillow
安裝結束之後,我們便來看一段範例:
# -*- coding: utf-8 -*-
from PIL import Image
image = Image.open('input.jpg')
print(image)
print(image.mode)
Output:
<PIL.Image.Image image mode=RGBA size=626x417 at 0x179240973C8>
RGB
我們可以看到這是個 PIL.Image.Image
資料型態的檔案,而且這個檔案的模式為 "RGB"。想要將圖片背景設為透明,我們首先需要將 "RGB" 轉為 "RGBA"。
image = image.convert('RGBA')
print(image.mode)
Output:
RGBA
然後我們先拿出這張圖片的像素值,並判斷像素是否為白色 (255, 255, 255):
# Transparency
newImage = []
for item in image.getdata():
if item[:3] == (255, 255, 255):
newImage.append((255, 255, 255, 0))
else:
newImage.append(item)
image.putdata(newImage)
可以看到,我將所有像素值為 (255, 255, 255) 的點通通取代成透明了。當然,這裡可以自己設定要轉換什麼顏色。
image.save('output.png')
最後,記得將圖片儲存為 PNG 格式, JPG 格式貌似是不支援透明背景的。
這張的背景已經是透明的了,當然,如果背景都是一片白色的話其實看不出明顯差異,哈哈哈。
完整程式碼
# -*- coding: utf-8 -*-
from PIL import Image
image = Image.open('input.jpg')
image = image.convert('RGBA')
print(image.mode)
# Transparency
newImage = []
for item in image.getdata():
if item[:3] == (255, 255, 255):
newImage.append((255, 255, 255, 0))
else:
newImage.append(item)
image.putdata(newImage)
image.save('output.png')
print(image.mode, image.size)
References
- https://stackoverflow.com/questions/8376359/how-to-create-a-transparent-gif-or-png-with-pil-python-imaging
- https://www.geeksforgeeks.org/create-transparent-png-image-with-python-pillow/