dot*_*hen 34 command-line convert software-recommendation image-processing
许多询问 如何 从一组png 图像创建动画 gif 的问题建议使用 ImageMagick命令的变体: convert
convert -delay 2 -loop 0 *.png animated.gif
Run Code Online (Sandbox Code Playgroud)
但是,我有几千张图像,因此convert
用完了我所有的内存,交换,然后崩溃。有哪些替代软件存在,哪个更注重记忆?如果.gif
不支持,我可以使用另一种开放格式,我更喜欢 CLI 工具。
小智 35
听起来您正在尝试制作视频。如果是这种情况,那么我会使用适当的视频格式。
在这种情况下,我会使用ffmpeg将单个 PNG 文件转换为 H.264 视频。由于 ffmpeg 用于处理可能长达数小时的视频,因此您的数千张图像应该没有问题。采用H.264,而不是gif动画将导致一个庞大的图像质量的改进。
这样的事情应该适合你:
ffmpeg -framerate 1/2 -i img%04d.png -c:v libx264 -r 30 out.mp4
Run Code Online (Sandbox Code Playgroud)
-framerate 1/2
:这将帧速率设置为二分之一 FPS,或每帧 2 秒。 -i img%04d.png
:告诉FFmpeg读取这些文件img0000.png
虽然img9999.png
。-c:v libx264
:使用视频编解码器 libx264。
-crf <number>
: 质量设置。0 到 51。23 是默认值。0 是真正的无损编码,这将是相当高的带宽。18 在视觉上几乎无损。-r 30
:将输出帧率设置为 30 FPS。每个输入图像都将被复制以生成您在此处指定的输出。您可以关闭此参数,输出文件将处于输入帧率,但我刚刚尝试时生成的电影无法正常显示。out.mp4
: 输出文件名。参考:
ter*_*don 14
就个人而言,我只会在有限数量的文件上启动它,而不是一次启动。例如,这样的事情:
#!/usr/bin/env bash
## Collect all png files in the files array
files=( *png )
## How many should be done at once
batch=50
## Read the array in batches of $batch
for (( i=0; $i<${#files[@]}; i+=$batch ))
do
## Convert this batch
convert -delay 2 -loop 0 "${files[@]:$i:$batch}" animated.$i.gif
done
## Now, merge them into a single file
convert animated.*.gif all.gif
Run Code Online (Sandbox Code Playgroud)
使用-limit memory 1GiB
限制的内存量convert
使用。
数以千计的图像将创建一个巨大的 GIF,大多数计算机将难以显示。如果可能,我将我的动画 GIF 保持在 200 张以下。越少越好。如果您给图像编号,此命令将删除奇数编号的图像rm *[13579].png
。
所以这是我从电影场景创建动画 GIF 的典型工作流程:
avconv -ss 00:26:00 -i someMovie.mpg %5d.png
rm *[13579].png
convert -limit memory 1GiB -loop 0 -layers optimize -resize 400 *.png output.gif
Run Code Online (Sandbox Code Playgroud)
如果你有数千个 png-s,anigif 格式会很奇怪。我会这样做,使用avconv
:
avconv -i "%d.png" -r 25 -c:v libx264 -crf 20 -pix_fmt yuv420p animated.mov
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
36790 次 |
最近记录: |