
看到你正在整理“暗影花仙精靈王”系列的卡牌圖片這種圖片素材通常數量多、文件名混亂、格式不統一手動一張張重命名和壓縮非常低效。結合我過去的批量圖片處理經驗整理了一套完整的 Python 批量處理方案可以把圖片整理這件事徹底自動化。本文會從實際需求出發帶你用 Python 實現“暗影花仙精靈王卡牌圖片3”這類批次圖片的批量重命名、統一壓縮、格式轉換和統計歸檔全程提供可直接復制的代碼。1. 背景與核心概念1.1 什么是圖片批量處理圖片批量處理是指通過腳本或工具一次性對大量圖片文件執行相同或相似的操作。常見的操作包括批量重命名將“IMG_20250401_123456.jpg”這種相機默認名改成“暗影花仙精靈王_003.jpg”這種有語義的名字。批量壓縮將高分辨率圖片等比縮小降低存儲占用。批量轉換格式比如把 PNG 轉為 JPG或者統一輸出為 WebP。批量統計統計每個批次圖片的數量、尺寸分布、總大小。重復檢測找出內容完全相同或接近的圖片。在這個需求里“3”通常代表第 3 個批次也就是一批編號連續的卡牌圖片素材。我們需要把這一批圖片按一定規則歸整好。1.2 為什么用 PythonPython 在圖片處理領域有非常成熟的生態尤其是 Pillow 庫幾乎是圖像處理的標準庫。使用 Python 處理圖片有以下優勢優勢說明語法簡單處理邏輯清晰適合維護和調整跨平臺Windows、Linux、macOS 都能跑同一套腳本生態豐富配合 pathlib、re、argparse 等標準庫無需額外安裝太多依賴數據處理方便可以配合 pandas 生成圖片清單 Excel可擴展性強后續要接入 OCR、AI 分類也方便1.3 適用場景游戲卡牌圖片整理例如“暗影花仙精靈王”系列各批次卡圖。電商商品圖批量壓縮。攝影素材按日期和主題歸檔。設計師交付圖統一命名。訓練數據集的預處理。2. 環境準備與版本說明本文以常見環境為例具體版本請根據你的實際情況調整。建議使用 Python 3.8 及以上版本Pillow 使用 8.0 以上版本。2.1 驗證 Python 環境在命令行執行python --version如果你看到類似Python 3.10.12的輸出說明環境正常。如果提示找不到命令可以嘗試python3。2.2 安裝 PillowPillow 是 Python 中最常用的圖像處理庫它是 PILPython Imaging Library的積極維護分支。pip install pillow國內網絡環境下可以使用國內鏡像加速pip install pillow -i https://pypi.tuna.tsinghua.edu.cn/simple安裝完成后驗證python -c from PIL import Image; print(Image.__version__)能看到版本號就說明 Pillow 安裝成功。2.3 示例目錄結構假設我們拿到了一批圖片素材目錄結構如下cards_batch3/ ├── raw/ # 原始圖片 │ ├── 01.jpg │ ├── 02.png │ ├── 03.jpg │ └── ... ├── output/ # 處理后的圖片 └── logs/ # 運行日志我們把原始圖片放在raw目錄處理結果輸出到output目錄日志放在logs目錄。這樣結構清晰后續擴展也方便。3. 核心知識點拆解3.1 Pillow 的基本使用Pillow 可以打開各種格式的圖片并能獲取圖片的基本信息from PIL import Image img Image.open(raw/01.jpg) print(img.size) print(img.mode) print(img.format)size一個元組例如(1920, 1080)表示寬和高。mode像素模式常見的有RGB、RGBA、L灰度。format原始文件格式例如JPEG、PNG。這是批量處理的基礎因為后續的壓縮、轉換都需要先打開圖片。3.2 pathlib 路徑管理Python 標準庫pathlib提供了面向對象的路徑操作寫起來比os.path更簡潔from pathlib import Path input_dir Path(raw) output_dir Path(output) # 遍歷目錄下所有圖片文件 for img_path in input_dir.glob(*.jpg): print(img_path.name)Path(raw)創建路徑對象。.glob(*.jpg)匹配目錄下所有.jpg文件。.name獲取文件名。.stem獲取不帶后綴的文件名。.suffix獲取文件后綴。3.3 批量重命名規則設計在開始寫代碼之前先明確重命名規則。本文采用暗影花仙精靈王_001.jpg 暗影花仙精靈王_002.jpg 暗影花仙精靈王_003.jpg規則說明前綴固定為“暗影花仙精靈王”中間用下劃線分隔。序號使用 3 位數字不足補 0方便排序。原文件后綴保留但如果圖片實際格式與后綴不一致應統一糾正。之所以用 3 位數字是考慮到同一批圖片數量通常不超過 999 張。如果批次數量更大可以改成04d即 4 位數字。3.4 圖片壓縮與轉換原理卡牌圖片一般是高清大圖動輒幾 MB。為了便于分享和傳輸通常需要壓縮。壓縮的核心參數有兩個尺寸等比縮小寬度和高度。質量JPG 格式有 1-100 的質量參數值越大文件越大畫質也越好。Pillow 中調整尺寸使用resize方法保存 JPG 時指定quality參數img.thumbnail((800, 800)) img.save(output/compressed.jpg, quality85)thumbnail會保持圖片比例且不會放大圖片。這個特性非常適合批量壓縮。4. 完整實戰案例下面進入核心部分。我們將編寫三個腳本rename_images.py批量重命名圖片。compress_images.py批量壓縮圖片。generate_manifest.py生成圖片信息清單。建議把這些腳本放在項目根目錄下的scripts目錄。4.1 創建項目結構首先創建以下目錄結構cards_batch3/ ├── raw/ ├── output/ ├── logs/ └── scripts/在命令行中執行mkdir -p cards_batch3/{raw,output,logs,scripts}如果你用的是 Windows PowerShell可以分開執行mkdir cards_batch3\raw mkdir cards_batch3\output mkdir cards_batch3\logs mkdir cards_batch3\scripts4.2 編寫批量重命名腳本文件路徑cards_batch3/scripts/rename_images.py# -*- coding: utf-8 -*- 卡牌圖片批量重命名腳本 規則暗影花仙精靈王_001.jpg import re from pathlib import Path # 配置 INPUT_DIR Path(__file__).parent.parent / raw PREFIX 暗影花仙精靈王 START_INDEX 1 DIGIT_COUNT 3 # 支持處理的圖片格式 SUPPORTED_SUFFIXES {.jpg, .jpeg, .png, .webp, .bmp} def main(): # 檢查目錄是否存在 if not INPUT_DIR.exists(): print(f錯誤目錄不存在 {INPUT_DIR}) return # 獲取所有圖片文件按文件名排序 image_files [ p for p in INPUT_DIR.iterdir() if p.is_file() and p.suffix.lower() in SUPPORTED_SUFFIXES ] image_files.sort(keylambda p: p.name) if not image_files: print(錯誤沒有找到任何圖片文件) return print(f發現 {len(image_files)} 張圖片開始重命名...) # 記錄重命名結果 rename_records [] index START_INDEX for img_path in image_files: # 構造新文件名 new_name f{PREFIX}_{index:0{DIGIT_COUNT}d}{img_path.suffix.lower()} new_path img_path.with_name(new_name) # 如果目標文件名已存在且不是同一個文件則跳過 if new_path.exists() and new_path ! img_path: print(f跳過 {img_path.name} - {new_name}目標文件已存在) continue # 執行重命名 img_path.rename(new_path) rename_records.append((img_path.name, new_name)) print(f重命名{img_path.name} - {new_name}) index 1 # 寫入日志 log_dir Path(__file__).parent.parent / logs log_dir.mkdir(exist_okTrue) log_file log_dir / rename_log.txt with open(log_file, w, encodingutf-8) as f: for old_name, new_name in rename_records: f.write(f{old_name}\t{new_name}\n) print(f重命名完成共處理 {len(rename_records)} 張圖片) print(f日志已保存{log_file}) if __name__ __main__: main()腳本說明INPUT_DIR使用了Path(__file__).parent.parent / raw意思是“當前腳本文件所在目錄的上一級目錄下的 raw 目錄”這樣不管從哪個目錄執行腳本都能正確定位。SUPPORTED_SUFFIXES限制了處理的文件類型避免誤處理非圖片文件。重命名前檢查目標文件是否已存在避免覆蓋已有文件。日志以舊文件名 Tab 新文件名的格式存入logs/rename_log.txt方便審計和回滾。運行腳本cd cards_batch3 python scripts/rename_images.py4.3 編寫批量壓縮腳本文件路徑cards_batch3/scripts/compress_images.py# -*- coding: utf-8 -*- 卡牌圖片批量壓縮腳本 功能等比縮放圖片壓縮 JPG 質量將 PNG 轉為 JPG 輸出 from pathlib import Path from PIL import Image # 配置 RAW_DIR Path(__file__).parent.parent / raw OUTPUT_DIR Path(__file__).parent.parent / output MAX_WIDTH 800 # 目標最大寬度 MAX_HEIGHT 800 # 目標最大高度 JPG_QUALITY 85 # JPG 壓縮質量范圍 1-100 OUTPUT_FORMAT JPEG # 輸出格式JPEG / PNG / WEBP def process_image(img_path: Path, output_path: Path) - tuple: 處理單張圖片返回 (原文件名, 新文件名, 原大小, 新大小, 原尺寸, 新尺寸) with Image.open(img_path) as img: # 原始尺寸 original_size img.size original_bytes img_path.stat().st_size # 如果是 RGBA 模式轉為 RGBJPG 不支持透明通道 if img.mode in (RGBA, P, LA): img img.convert(RGB) # 等比縮放 img.thumbnail((MAX_WIDTH, MAX_HEIGHT)) # 新尺寸 new_size img.size # 保存輸出文件 output_path.parent.mkdir(parentsTrue, exist_okTrue) img.save(output_path, formatOUTPUT_FORMAT, qualityJPG_QUALITY) new_bytes output_path.stat().st_size return ( img_path.name, output_path.name, original_bytes, new_bytes, original_size, new_size, ) def main(): if not RAW_DIR.exists(): print(f錯誤目錄不存在 {RAW_DIR}) return supported_suffixes {.jpg, .jpeg, .png, .webp, .bmp} image_files [ p for p in RAW_DIR.iterdir() if p.is_file() and p.suffix.lower() in supported_suffixes ] image_files.sort(keylambda p: p.name) if not image_files: print(錯誤沒有找到任何圖片文件) return # 輸出目錄 OUTPUT_DIR.mkdir(parentsTrue, exist_okTrue) print(f發現 {len(image_files)} 張圖片開始壓縮...) results [] for img_path in image_files: # 新文件名保持原名后綴改為輸出格式對應后綴 if OUTPUT_FORMAT JPEG: new_suffix .jpg elif OUTPUT_FORMAT WEBP: new_suffix .webp else: new_suffix img_path.suffix.lower() new_name img_path.stem new_suffix output_path OUTPUT_DIR / new_name try: result process_image(img_path, output_path) results.append(result) old_kb result[2] / 1024 new_kb result[3] / 1024 ratio new_kb / old_kb * 100 if old_kb 0 else 0 print( f壓縮{result[0]} - {result[1]} | f{old_kb:.1f}KB - {new_kb:.1f}KB | {ratio:.1f}% ) except Exception as e: print(f處理失敗{img_path.name}錯誤{e}) # 生成統計日志 log_dir Path(__file__).parent.parent / logs log_dir.mkdir(exist_okTrue) log_file log_dir / compress_log.txt with open(log_file, w, encodingutf-8) as f: f.write(原文件名\t新文件名\t原大小(B)\t新大小(B)\t原尺寸\t新尺寸\n) for r in results: f.write(f{r[0]}\t{r[1]}\t{r[2]}\t{r[3]}\t{r[4]}\t{r[5]}\n) total_old sum(r[2] for r in results) total_new sum(r[3] for r in results) total_ratio total_new / total_old * 100 if total_old 0 else 0 print(f壓縮完成共處理 {len(results)} 張圖片) print(f總大小{total_old / 1024 / 1024:.2f}MB - {total_new / 1024 / 1024:.2f}MB) print(f壓縮率{total_ratio:.1f}%) if __name__ __main__: main()腳本說明Image.open之后使用with上下文管理器確保文件句柄被正確關閉。img.thumbnail((MAX_WIDTH, MAX_HEIGHT))會按比例縮小圖片同時保證不超過設定的寬高。quality85是 JPG 保存時的質量參數。對于卡牌圖片85 是一個在畫質和大小之間比較均衡的取值。日志記錄了每張圖片壓縮前后的體積和尺寸變化方便查看壓縮效果。運行腳本cd cards_batch3 python scripts/compress_images.py4.4 編寫圖片信息清單生成腳本文件路徑cards_batch3/scripts/generate_manifest.py# -*- coding: utf-8 -*- 生成圖片信息清單 輸出圖片文件名、尺寸、大小、格式等信息的 CSV 文件 import csv from pathlib import Path from PIL import Image # 配置處理 output 目錄 TARGET_DIR Path(__file__).parent.parent / output OUTPUT_CSV Path(__file__).parent.parent / logs / manifest.csv def main(): if not TARGET_DIR.exists(): print(f錯誤目錄不存在 {TARGET_DIR}) return supported_suffixes {.jpg, .jpeg, .png, .webp, .bmp} image_files [ p for p in TARGET_DIR.iterdir() if p.is_file() and p.suffix.lower() in supported_suffixes ] image_files.sort(keylambda p: p.name) if not image_files: print(錯誤沒有找到任何圖片文件) return print(f發現 {len(image_files)} 張圖片正在生成清單...) rows [] for img_path in image_files: with Image.open(img_path) as img: size img.size img_format img.format file_size img_path.stat().st_size rows.append({ 文件名: img_path.name, 格式: img_format, 寬度: size[0], 高度: size[1], 文件大小(B): file_size, }) # 輸出 CSV log_dir OUTPUT_CSV.parent log_dir.mkdir(exist_okTrue) with open(OUTPUT_CSV, w, encodingutf-8-sig, newline) as f: fieldnames [文件名, 格式, 寬度, 高度, 文件大小(B)] writer csv.DictWriter(f, fieldnamesfieldnames) writer.writeheader() writer.writerows(rows) print(f清單已生成{OUTPUT_CSV}) print(f共 {len(rows)} 張圖片) if __name__ __main__: main()腳本說明這里使用utf-8-sig編碼保存 CSV這樣用 Excel 直接打開不會出現中文亂碼。newline避免了 CSV 中每行后面多一個空行的問題。信息清單方便你核對整個批次的圖片情況也可以作為交付說明文檔。運行腳本cd cards_batch3 python scripts/generate_manifest.py4.5 運行結果說明按順序執行三個腳本后目錄結構會變成cards_batch3/ ├── raw/ │ ├── 暗影花仙精靈王_001.jpg │ ├── 暗影花仙精靈王_002.jpg │ ├── 暗影花仙精靈王_003.jpg │ └── ... ├── output/ │ ├── 暗影花仙精靈王_001.jpg │ ├── 暗影花仙精靈王_002.jpg │ └── ... ├── logs/ │ ├── rename_log.txt │ ├── compress_log.txt │ └── manifest.csv └── scripts/ ├── rename_images.py ├── compress_images.py └── generate_manifest.pyraw目錄下是重命名后的原始圖片output目錄下是壓縮后的圖片logs目錄下是三個腳本生成的日志和清單文件。5. 常見問題與排查思路5.1 重命名時報錯“目標文件已存在”問題現象常見原因解決思路重命名時提示目標文件已存在之前可能運行過腳本部分文件已被重命名檢查目標文件名對應的日志確認之前是否處理過刪除多余文件或調整起始序號如果重復運行重命名腳本第二次運行時會發現暗影花仙精靈王_001.jpg已經存在腳本會跳過。這是設計好的保護邏輯防止覆蓋已有文件。5.2 壓縮后圖片大小反而變大問題現象常見原因解決思路壓縮后文件比原圖還大原圖本身已經是高壓縮比的 JPG 或尺寸不大PNG 轉 JPG 后質量參數偏高將quality從 85 降到 70 重新壓縮或者只在原始圖片尺寸較大時才壓縮可以將process_image中增加條件判斷如果新文件大于舊文件則保留原文件這里需要理解一個概念JPG 是有損壓縮如果原始圖片已經是質量很高的 JPG再用quality85重新壓縮生成的圖片可能比原圖還大。在實際處理中可以把quality調低或者增加“只壓縮比原圖小的圖片”的邏輯。5.3 PNG 圖片壓縮后透明背景變黑問題現象常見原因解決思路PNG 轉 JPG 后原本透明的區域變成黑色JPG 格式不支持透明通道轉換時透明像素被填充為黑色在轉換前使用convert(RGB)并將透明區域填充為白色詳見下方代碼如果卡牌圖片有透明背景轉成 JPG 時建議先填充白色背景from PIL import Image img Image.open(raw/帶有透明背景的圖片.png) if img.mode RGBA: background Image.new(RGB, img.size, (255, 255, 255)) background.paste(img, maskimg.split()[-1]) img background這是在批量壓縮腳本中值得補充的細節。如果你的卡牌圖片不涉及透明背景可以不處理。5.4 腳本運行報錯“ModuleNotFoundError: No module named PIL”這個錯誤說明 Pillow 沒有安裝成功。按順序排查pip --version pip install pillow python -c from PIL import Image; print(OK)如果 install 提示權限問題可以在 Windows 上嘗試pip install pillow --user5.5 縮略圖沒有生效thumbnail方法有一個特點如果圖片尺寸本身小于指定尺寸它不會放大圖片。也就是說一張400x300的圖片即使設置MAX_WIDTH800也不會被放大到800x600。這通常是合理的行為。如果你希望統一尺寸需要用resize并明確指定目標尺寸但這樣會改變圖片寬高比可能導致卡牌變形。建議優先使用thumbnail。6. 最佳實踐與工程建議6.1 操作前先做備份圖片處理是不可逆操作。雖然本文腳本的日志會記錄原始文件名和新文件名的對應關系但更穩妥的做法是在處理前對整個raw目錄做一次備份cp -r raw raw_backupWindows PowerShellCopy-Item -Path raw -Destination raw_backup -Recurse有了備份即使處理結果不理想也能隨時恢復。6.2 使用 dry-run 模式在正式執行重命名之前可以加一個--dry-run參數只打印操作結果而不真正執行。這樣可以在實際操作前發現潛在問題。下面是一個簡化版的改造思路import sys DRY_RUN --dry-run in sys.argv # 在重命名循環中 if DRY_RUN: print(f[預演] {img_path.name} - {new_name}) else: img_path.rename(new_path)6.3 文件名編碼問題如果圖片文件名包含中文或者特殊字符在不同操作系統間傳輸時可能會出問題。建議文件名統一使用中文字段加英文數字的組合例如“暗影花仙精靈王_001”。避免在文件名中使用空格、/、\、:、*、?、、、、|等特殊字符。6.4 版權合規提醒卡牌圖片通常有版權歸屬。整理和處理這些圖片時應當注意僅用于個人學習、素材管理和內部使用。不要未經授權公開傳播無版權的素材圖片。如果圖片用于公開發布或商業用途請先確認版權授權情況。6.5 合理設置壓縮質量壓縮質量并不是越低越好。對于卡牌類圖片建議用途質量參數說明網絡預覽70-75文件小加載快肉眼基本無差別本地歸檔82-88畫質接近原圖體積控制較好精修原圖92-100保留細節但文件較大6.6 日志與審計生產環境或重要項目里批量處理一定要有日志。本文的日志采用文件名加Tab加結果的格式便于后續用腳本或 Excel 分析。你也可以把日志接入統一的日志系統便于追溯。7. 總結與進一步擴展通過這篇文章你已經掌握了用 Python 對“暗影花仙精靈王卡牌圖片3”這類批次圖片進行完整整理的方法用rename_images.py批量重命名圖片規則清晰、日志可追溯。用compress_images.py將圖片等比壓縮控制文件大小。用generate_manifest.py生成圖片清單方便核對和交付。這三個腳本組成了一個完整的圖片批處理工具鏈后續可以按需擴展加入圖片去重功能使用圖像哈希算法檢測重復圖片。加入 OCR 識別自動識別卡牌名稱并作為文件名。加入水印功能批量給圖片添加版權水印。接入 Excel 報表生成更美觀的圖片清單。圖片整理是一個基礎且高頻的需求掌握這套腳本的思路后不管是卡牌圖片、攝影素材還是商品圖都能套用。建議你先拿少量圖片測試確認運行結果符合預期后再處理大批量數據。如果本文對你有幫助可以收藏備用。后續遇到圖片處理相關問題也歡迎在評論區交流討論。