Python 實現海報圖片拼接

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」等獲取免費精品學習資料。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章