1. 問題概述

我們經常需要從動畫序列中選取關鍵幀,例如:

  • 文件名:進度條_00000-min.png進度條_00099-min.png(共100幀)
  • 需求:保留首尾幀,並均勻選取中間幀,總共保留32張 **實現效果: ** 開始效果 在這裏插入圖片描述 實現效果 在這裏插入圖片描述

2. 兩種實現方案

方案一:自動計算法(推薦)

計算原理

  1. 總幀數 = 結束幀 - 開始幀 + 1 = 100
  2. 需保留幀數 = 32(首尾+中間30幀)
  3. 計算間隔 = (100-2)/30 ≈ 3.266 → 取整為3

PowerShell腳本

cd "C:\動畫文件夾"

# 計算保留幀號
$keepFrames = @(0) + (3..96 | Where-Object { $_ % 3 -eq 0 }) + 99

# 生成文件名
$keepFiles = $keepFrames | ForEach-Object { "進度條_{0:D5}-min.png" -f $_ }

# 安全檢查
$keepFiles | Sort-Object
"保留文件數:" + $keepFiles.Count

# 預覽待刪除文件
Get-ChildItem "進度條_*-min.png" | Where-Object { $keepFiles -notcontains $_.Name } | Select-Object Name

# 執行刪除(取消註釋)
# Get-ChildItem "進度條_*-min.png" | Where-Object { $keepFiles -notcontains $_.Name } | Remove-Item -Verbose

優點

  • 自動計算間隔,確保均勻分佈
  • 適用於任意幀數的動畫序列
  • 可靈活調整間隔值

方案二:手動列表法

適用場景

  • 文件名格式不規律時
  • 需要精確控制保留的特定幀

PowerShell腳本

cd "C:\動畫文件夾"

# 明確列出要保留的32個文件名
$keepFiles = @(
    "進度條_00000-min.png",
    "進度條_00003-min.png",
    "進度條_00006-min.png",
    # ...中間省略...
    "進度條_00099-min.png"
)

# 直接刪除不在列表中的文件
Get-ChildItem -File | Where-Object { $keepFiles -notcontains $_.Name } | Remove-Item -Verbose

優點

  • 完全掌控保留的每一幀
  • 適合有特殊幀選取需求的場景

3. 操作流程對比

步驟 自動計算法 手動列表法
1 計算總幀數 列出所有要保留的文件名
2 計算間隔值 檢查文件名是否正確
3 生成幀號列表 直接執行刪除
4 轉換為文件名
5 安全檢查
6 執行刪除

4. 注意事項

  1. 必做備份:操作前複製整個文件夾(備份,以防出現bug)
  2. 文件名驗證
    • 檢查擴展名(.png/.jpg)
    • 確認前綴("進度條_")
  3. 間隔調整
    • 動作快的部分可減小間隔
    • 靜止部分可增大間隔
  4. 特殊處理
    # 保留特定關鍵幀(如00050)
    $keepFiles += "進度條_00050-min.png"
    

5. 常見問題解決

Q:執行後幀數不對怎麼辦? A:檢查:

  1. 文件名是否匹配
  2. 總幀數計算是否正確
  3. 間隔值是否合適

Q:如何保留更多關鍵幀? A:減小間隔值:

# 改為每隔2幀
$keepFrames = @(0) + (2..97 | Where-Object { $_ % 2 -eq 0 }) + 99

6. 總結建議

  • 常規情況:使用自動計算法,高效可靠
  • 特殊需求:使用手動列表法,精準控制
  • 最佳實踐
    1. 先備份
    2. 用Select-Object預覽
    3. 小範圍測試後再全量執行

您好,我是肥晨。 歡迎關注我獲取前端學習資源,日常分享技術變革,生存法則;行業內幕,洞察先機。