Python 實現圖片拼接
最近寫了一片文章:「有點好奇」我都追過哪些美劇,文章配圖時想把看過的美劇海報拼接成一張圖。
第一個想到的是使用 PS 導入拼接,但這種做法顯得不夠極客,於是決定使用 Python 代碼實現圖片拼接。
首先原圖片是 24 張美劇海報圖片,需要將其拼接爲一張 3*8 的圖片。
上圖拼接效果如下:
代碼實現
對於圖片的合併,需要讀取本地圖片,同時使用到 PIL 模塊。因此如果你未安裝此模塊,可以使用 pip 進行安裝。
模塊代碼如下:
import PIL.Image as Image
import os
隨後定義一些常量:
IMAGES_PATH = './serials/' # 圖片集地址
IMAGE_WIDTH = 200 # 每張小圖片的寬度
IMAGE_HEIGHT = 300 # 每張小片的高度
IMAGE_ROW = 3 # 圖片間隔,也就是合併成一張圖後,一共有幾行
IMAGE_COLUMN = 8 # 圖片間隔,也就是合併成一張圖後,一共有幾列
IMAGES_FORMAT = ['.jpg', '.JPG', 'png'] # 圖片格式
IMAGE_SAVE_PATH = 'final.jpg' # 圖片轉換後的地址
這裏需要對讀取到照片數量進行判斷:
# 獲取圖片集地址下的所有圖片名稱
image_names = [name for name in os.listdir(IMAGES_PATH) for item in IMAGES_FORMAT if
os.path.splitext(name)[1] == item]
# 簡單的對於參數的設定和實際圖片集的大小進行數量判斷
if len(image_names) != IMAGE_ROW * IMAGE_COLUMN:
raise ValueError("合成圖片的參數和要求的數量不能匹配!")
最後通過循環對圖片進行拼接:
# 定義圖像拼接函數
def image_compose():
to_image = Image.new('RGB', (IMAGE_COLUMN * IMAGE_WIDTH, IMAGE_ROW * IMAGE_HEIGHT)) #創建一個新圖
# 循環遍歷,把每張圖片按順序粘貼到對應位置上
for y in range(1, IMAGE_ROW + 1):
for x in range(1, IMAGE_COLUMN + 1):
from_image = Image.open(IMAGES_PATH + image_names[IMAGE_COLUMN * (y - 1) + x - 1]).resize(
(IMAGE_WIDTH, IMAGE_HEIGHT),Image.ANTIALIAS)
to_image.paste(from_image, ((x - 1) * IMAGE_WIDTH, (y - 1) * IMAGE_HEIGHT))
return to_image.save(IMAGE_SAVE_PATH) # 保存新圖
image_compose() #調用函數
運行後拼接的圖片如下圖:
完整代碼可以移步 Github 查看。
關注公衆號『嗜碼』。回覆關鍵字「前端」、「Python」、「Java」、「Android」、「小程序」、「Vue」等獲取免費精品學習資料。