PowerShell脚本实现|从文件夹动画序列中均匀选取关键帧(保留首尾帧)
文章目录
- 1. 问题概述
- 2. 两种实现方案
- 方案一:自动计算法(推荐)
- 方案二:手动列表法
- 3. 操作流程对比
- 4. 注意事项
- 5. 常见问题解决
- 6. 总结建议
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预览
- 小范围测试后再全量执行
您好,我是肥晨。
欢迎关注我获取前端学习资源,日常分享技术变革,生存法则;行业内幕,洞察先机。