需求簡述:可以將子目錄的每兩張圖片水平合併,例如兩張 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
▲ 示意圖。
留言區 / Comments
萌芽論壇