拼接多張圖片
這篇文章會使用 Python 的 Pillow 第三方函式庫,將多張圖片拼接成一張大張的圖片,在拼接的過程中,替每張圖片加上邊框效果。
快速導覽:
- 本篇使用的 Python 版本為 3.7.12,所有範例可使用 Google Colab 實作,不用安裝任何軟體 ( 參考:使用 Google Colab )
- 使用 Colab 操作需要連動 Google 雲端硬碟,請參考:連動 Google Drive
安裝 Pillow
輸入下列指令安裝 Pillow,根據個人環境使用 pip 或 pip3,如果使用 Colab 或 Anaconda Jupyter,已經內建 Pillow 函式庫。
!pip install Pillow
產生全新的空白圖片
使用 Pillow 函式庫裡 Image.new() 的方法,可以產生一張指定大小的圖片,使用方法如下:
from PIL import Image
img = Image.new(mode, size, color)
# mode 色彩模式,可使用 RGB 或 RGBA
# size 長寬尺寸,tuple 格式 ( 寬, 長 )
# color 顏色,預設黑色 #000000
下方的程式碼執行後,會產生一張 400x300 背景全紅的圖片。
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks') # Colab 換路徑使用
from PIL import Image
bg = Image.new('RGB',(400, 300), '#ff0000') # 產生 RGB 色域,400x300 背景紅色的圖片
bg.save('oxxostudio.jpg')
# bg.show() # Colab 不支援直接顯示,如果使用本機環境會開啟圖片檢視器
如果儲存的圖片為 png 格式,可以使用 RGBA 色域,產生半透明或全透明的圖片。
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks') # Colab 換路徑使用
from PIL import Image
bg = Image.new('RGB',(400, 300), '#ff000055') # 產生 RGBA 色域,400x300 背景半透明紅色的圖片
bg.save('oxxostudio.png')
使用 paste 拼接多張圖片
產生一張空白的影像後,使用 for 迴圈的方式,依序開啟需要拼貼的圖片,透過 resize 改變圖片尺寸,再利用 paste 的方法將開啟的圖片,貼到空白的影像上,就可以實現拼接多張圖片的效果,下方的程式執行後,會依序開啟八張圖片 ( 檔名是 d1.jpg~d8.jpg ),開啟後將圖片拼貼到空白影像裡。
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks') # Colab 換路徑使用
from PIL import Image
bg = Image.new('RGB',(1200, 800), '#000000') # 產生一張 1200x800 的全黑圖片
for i in range(1,9):
img = Image.open(f'd{i}.jpg') # 開啟圖片
img = img.resize((300, 400)) # 縮小尺寸為 300x400
x = (i-1)%4 # 根據開啟的順序,決定 x 座標
y = (i-1)//4 # 根據開啟的順序,決定 y 座標 ( // 為快速取整數 )
bg.paste(img,(x*300, y*400)) # 貼上圖片
bg.save('oxxostudio.jpg')
替拼接的圖片加上邊框
使用 Pillow ImageOps 模組裡的 expand 方法,能夠以指定的顏色,將影像的四個邊擴展出去,實現邊框的效果,使用方法如下:
from PIL import Image, ImageOps
img = ImageOps.expand(image , border, fill)
# image 來源影像
# border 四個邊擴張的數值,使用 tuple 格式 (左, 上, 右, 下),如果只有一個數值,則四個邊都會套用同樣的數值
延伸上方的程式碼,在讀取每一張影像時替影像加入邊框,最後就可以做出有白色分隔的拼貼圖片效果。
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks') # Colab 換路徑使用
from PIL import Image, ImageOps
bg = Image.new('RGB',(1240, 840), '#000000') # 因為擴張,所以將尺寸改成 1240x840
for i in range(1,9):
img = Image.open(f'd{i}.jpg')
img = img.resize((300, 400))
img = ImageOps.expand(img, 20, '#ffffff') # 擴張邊緣,產生邊框
x = (i-1)%4
y = (i-1)//4
bg.paste(img,(x*300, y*400))
bg.save('oxxostudio.jpg')
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~