大家好,
我正在尝试通过以下方式使用 imagemagick 创建动画:
convert -delay 80 -loop 0 *.png ani.gif
逻辑是找到所有 .png 文件,但文件名没有按数字顺序列出。这导致动画序列构建得不好。
例如
-a--- 3/17/2015 8:36 PM 14147 26.png
-a--- 3/17/2015 8:37 PM 13904 260.png
-a--- 3/17/2015 8:37 PM 13981 261.png
-a--- 3/17/2015 8:37 PM 13863 262.png
-a--- 3/17/2015 8:37 PM 14026 263.png
-a--- 3/17/2015 8:37 PM 14023 264.png
-a--- 3/17/2015 8:37 PM 14038 265.png
-a--- 3/17/2015 8:37 PM 13913 266.png
-a--- 3/17/2015 8:37 PM 14003 267.png
-a--- 3/17/2015 8:37 PM 14000 268.png
-a--- 3/17/2015 8:37 PM 13887 269.png
-a--- 3/17/2015 8:36 PM 14025 27.png
我尝试强制目录按时间和日期列出,但无济于事:
set dircmd=/o:d
我怎样才能让文件在内部列出如下:
-a--- 3/17/2015 8:36 PM 14147 26.png
-a--- 3/17/2015 8:36 PM 14025 27.png
-a--- 3/17/2015 8:37 PM 13904 260.png
-a--- 3/17/2015 8:37 PM 13981 261.png
-a--- 3/17/2015 8:37 PM 13863 262.png
-a--- 3/17/2015 8:37 PM 14026 263.png
-a--- 3/17/2015 8:37 PM 14023 264.png
-a--- 3/17/2015 8:37 PM 14038 265.png
-a--- 3/17/2015 8:37 PM 13913 266.png
-a--- 3/17/2015 8:37 PM 14003 267.png
-a--- 3/17/2015 8:37 PM 14000 268.png
-a--- 3/17/2015 8:37 PM 13887 269.png
那么当运行转换命令时,正确的序列会被压入 gif 中吗?
答案1
假设您使用通配符时,转换程序会按名称的字母顺序对文件进行排序。最简单的解决方案是使用零填充重命名文件,以便文件名按正确的数字顺序排序。
我编写了一个混合 JScript/批处理实用程序,名为杰任巴特可以使用正则表达式替换来重命名文件。它是纯脚本,可以在 XP 及以上版本的任何 Windows 机器上本地运行。
杰任巴特使解决方案变得非常简单(例如,假设您还没有与 27.png 冲突的现有 027.png):
jren "^\d+(?=\.png)" "lpad($0,'000')" /j
运行该命令后,名为 5.png 的文件将变为 005.png,而 27.png 将变为 027.png。然后,您原来的转换命令应该能够按正确的顺序处理文件。
使用jren /?
获取有关 JREN.BAT 的众多选项的完整文档
您可以使用纯批处理进行重命名,但这并不方便
@echo off
setlocal enableDelayedExpansion
for /f "delims=" %%F in (
'dir /b /a-d ???.png ^| findstr "^[0-9][0-9]*\.png$" /i'
) do (
set "num=000%%~nF"
ren "%%F" "!num:~-3!%%~xF"
)