1. 問題概述
我們經常需要從動畫序列中選取關鍵幀,例如:
- 文件名:
進度條_00000-min.png到進度條_00099-min.png(共100幀) - 需求:保留首尾幀,並均勻選取中間幀,總共保留32張 **實現效果: ** 開始效果
實現效果
2. 兩種實現方案
方案一:自動計算法(推薦)
計算原理
- 總幀數 = 結束幀 - 開始幀 + 1 = 100
- 需保留幀數 = 32(首尾+中間30幀)
- 計算間隔 = (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. 注意事項
- 必做備份:操作前複製整個文件夾(備份,以防出現bug)
- 文件名驗證:
- 檢查擴展名(.png/.jpg)
- 確認前綴("進度條_")
- 間隔調整:
- 動作快的部分可減小間隔
- 靜止部分可增大間隔
- 特殊處理:
# 保留特定關鍵幀(如00050) $keepFiles += "進度條_00050-min.png"
5. 常見問題解決
Q:執行後幀數不對怎麼辦? A:檢查:
- 文件名是否匹配
- 總幀數計算是否正確
- 間隔值是否合適
Q:如何保留更多關鍵幀? A:減小間隔值:
# 改為每隔2幀
$keepFrames = @(0) + (2..97 | Where-Object { $_ % 2 -eq 0 }) + 99
6. 總結建議
- 常規情況:使用自動計算法,高效可靠
- 特殊需求:使用手動列表法,精準控制
- 最佳實踐:
- 先備份
- 用Select-Object預覽
- 小範圍測試後再全量執行
您好,我是肥晨。 歡迎關注我獲取前端學習資源,日常分享技術變革,生存法則;行業內幕,洞察先機。