Python:每兩張圖片水平合併成一張圖片

2023/03/09 1,085 1 程式設計 , Python

需求簡述:可以將子目錄的每兩張圖片水平合併,例如兩張 512 x 768 px 的圖檔會變成一張 1024 x 768 px,如果遇上圖片總張數為單數,則最後一張不合併。
詳細描述:寫一個 Python 程式,從子目錄 src 中取出副檔名為 jpeg、jpg、png 的圖檔,另外判斷若沒有圖片直接退出程式,接著再判斷圖片總數為單數則最後一張不合併(處理),接著開始每兩張圖片合併成一張圖片,完成後刪除 src 目錄下的所有處理好的圖片檔案,接著用 Windows 檔案總管打開 build 輸出目錄,裡面可以看到完成合併的所有圖片。

✅ 最終程式執行狀況如下:我先在 src 子目錄內放好雙數且要倆倆合併的圖片,接著我來到專案根目錄點兩下執行 run.bat,裡面只有 python run.py 指令以執行 run.py(電腦要先安裝 Python),最終 build 目錄得到倆倆合併好的 jpg 圖檔。

📄 run.py

from PIL import Image
import os
import time

# 設定要處理的目錄
src_dir = "src"
build_dir = "build"

# 取得目錄下的所有圖片檔案
images = [os.path.join(src_dir, file) for file in os.listdir(
    src_dir) if file.endswith(('jpeg', 'png', 'jpg'))]

# 如果沒有圖片,退出程式
if len(images) == 0:
    print("當前目錄下沒有圖片")
    time.sleep(2)  # 停留兩秒
    exit()

# 如果圖片總數為單數,最後一張不合併
if len(images) % 2 == 1:
    images = images[:-1]

# 每兩張圖片合併
for i in range(0, len(images), 2):
    image1 = Image.open(images[i])
    image2 = Image.open(images[i+1])
    width = image1.width + image2.width
    height = image1.height
    new_image = Image.new('RGB', (width, height))
    new_image.paste(image1, (0, 0))
    new_image.paste(image2, (image1.width, 0))
    output_path = os.path.join(build_dir, f'merge_{i//2}.jpg')
    new_image.save(output_path)

# 刪除 src 目錄下的所有圖片檔案
for image in images:
    os.remove(image)

# 使用檔案總管打開 build 目錄
os.startfile(build_dir)

解釋:

1. 匯入必要的模組:PIL、os、time。
2. 設定要處理的目錄:src 和 build。
3. 取得 src 目錄下的所有圖片檔案,如果沒有圖片,則在命令列列印出訊息並停留 2 秒,然後結束程式。
4. 如果有圖片,則檢查圖片總數是否為奇數,如果是,則將最後一張圖片排除在外。
5. 開始進行每兩張圖片的水平合併,並將結果輸出到 build 目錄下的 merge_xxx.jpg 檔案中。
6. 刪除 src 目錄下的所有圖片檔案。
7. 使用檔案總管打開 build 目錄。

※ 注意:僅能在 Windows 系統中正常打開檔案總管。

GitHub:https://github.com/qwe987299/image_per2_merge


▲ 示意圖。

贊助廣告 ‧ Sponsor advertisements

留言區 / Comments

萌芽論壇