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