我.gif
要从给定的.jpg
图片集中制作动画图片。
我希望从命令行执行此操作,因此非常欢迎使用命令行工具。
我.gif
要从给定的.jpg
图片集中制作动画图片。
我希望从命令行执行此操作,因此非常欢迎使用命令行工具。
Answers:
您可以使用ImageMagick包。使用以下命令安装它:
sudo apt-get install imagemagick
现在,您可以使用以下gif
图片创建一个图片jpg
:
convert -delay 20 -loop 0 *.jpg myimage.gif
-resize 50%
。
-deconstruct
。我还发现ImageMagick非常渴望存储,请参见基准:askubuntu.com/a/1102183/52975
convert -delay 0 -loop 0 *.tif myanimated.gif
在720个tif文件上效果很好
要完成@Maythux答案:
-resize
option:就我而言,我有4608x3456张图片,对于32张图片,生成的gif超过300M
convert -resize 20% -delay 20 -loop 0 *.jpg myimage.gif
要么
convert -resize 768x576 -delay 20 -loop 0 *.jpg myimage.gif
*.jpg
处理数字值时会有点烂,您可能会生成带有未排序图片的gif。
$ ls|cat
21-33-26_1.jpg
21-33-26_10.jpg // <--- this one
21-33-26_2.jpg
21-33-26_3.jpg
21-33-26_4.jpg
21-33-26_5.jpg
21-33-26_6.jpg
21-33-26_7.jpg
21-33-26_8.jpg
21-33-26_9.jpg
21-33-28_1.jpg // <--- should be here
21-33-28_2.jpg
21-33-28_3.jpg
...
由于拍摄的速度非常快(10 / s),所以它们的修改时间都相同,因此您不能使用ls -t
例如技巧。在ubuntu上,您可以使用ls -v
类似以下内容的代码:
convert -resize 768x576 -delay 20 -loop 0 `ls -v` myimage.gif
在Mac OS X上,数字排序非常棘手,我想您需要构建一个自定义脚本。
find
,,花sort
括号扩展等。ls
众所周知,该工具不适合这种事情。使用find
。有一些学习曲线,但这是值得的。
ffmeg解决方案+测试数据
从Ubuntu 18.10,ffpmeg 4.0.2-2,ImageMagick 6.9.10-8开始,我发现ffmpeg更快,并且使用的内存更少。
最简单的转换命令是:
ffmpeg \
-framerate 60 \
-pattern_type glob \
-i '*.png' \
-r 15 \
-vf scale=512:-1 \
out.gif \
;
您可以通过以下方式获取我的测试数据:
wget -O opengl-rotating-triangle.zip https://github.com/cirosantilli/media/blob/master/opengl-rotating-triangle.zip?raw=true
unzip opengl-rotating-triangle.zip
cd opengl-rotating-triangle
测试数据是使用以下网址生成的:https://stackoverflow.com/questions/3191978/how-to-use-glut-opengl-to-render-to-a-file/14324292#14324292,其中包含256个1024x1024 PNG图片。
这是另一个测试数据,您现在可以直接在浏览器中生成!https://stackoverflow.com/questions/19235286/convert-html5-canvas-sequence-to-a-video-file/57153718#57153718
ffmpeg
我要强调的重要选项是:
-pattern_type glob
:选择图像的便捷方法
-framerate 60
:在输入图像上假设60 FPS,并输出相同的FPS。
ffmpeg
否则无法知道,因为图像中没有FPS数据,而视频格式中也没有。
256个输入帧大约需要4秒钟才能完成。
-r 15
: 可选的。每4张图像选择一张,因此请减小尺寸(4 == 60 / 15
)。
带有它,identify out.gif
表示GIF仅包含64帧。
它仍然需要4秒钟才能播放,因此更改了延迟时间以使游戏匹配。
-vf scale=512:-1
: 可选的。按比例设置宽度,标尺高度,通常是为了减小尺寸并节省空间。
要使ImageMagick正常工作,我首先必须按照以下说明修改其磁盘和内存限制/etc/ImageMagick-6/policy.xml
:https : //superuser.com/questions/1178666/imagemagick-convert-quits-after-some-pages
也可以看看:
ImageMagick vs ffmpeg基准
我比较了命令:
/usr/bin/time -v convert *.png -deconstruct -delay 1.6 out-convert.gif
/usr/bin/time -v ffmpeg \
-framerate 60 \
-pattern_type glob \
-i '*.png' \
out-ffmpeg.gif \
;
构造命令以产生尽可能接近的输出以使比较有效:
/usr/bin/time -v
:用于查找最大内存使用情况,如以下网址所述:https : //stackoverflow.com/questions/774556/peak-memory-usage-of-a-linux-unix-process
-deconstruct
:GIF图像只能包含前一帧的最小修改矩形,以使GIF变小。
ffmpeg
默认情况下会计算这些差异,但除非-deconstruct
使用ImageMagick,否则不会计算。
基本上,您每次都希望通过ImageMagick使用该选项。
我们可以通过以下方式观察到差异:
identify out.gif
使用压缩版本时,所有帧的大小均小于初始帧的大小,例如:
out.gif[0] GIF 1024x1024 1024x1024+0+0 8-bit sRGB 256c 16.7865MiB 0.010u 0:00.010
out.gif[1] GIF 516x516 1024x1024+252+257 8-bit sRGB 256c 16.7865MiB 0.010u 0:00.010
out.gif[2] GIF 515x520 1024x1024+248+257 8-bit sRGB 256c 16.7865MiB 0.010u 0:00.010
在此示例中,仅第二帧516x516
而不是完整的1024x1024,并以偏移量放置252+257
。因此,它仅包含中间三角形。
-delay
:与的60FPS匹配的值ffmpeg
。转换效能不重要,但我不想冒险。
输出的GIF大小大致相同,外观看起来相同。
我们得到了ImageMagick:
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:56.16
Maximum resident set size (kbytes): 2676856
对于ffmpeg:
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:04.41
Maximum resident set size (kbytes): 97172
从中我们看到:
测试硬件:联想ThinkPad P51笔记本电脑,英特尔酷睿i7-7820HQ,32GB(16 + 16)DDR4 2400MHz SODIMM,512GB SSD PCIe TLC OPAL2。
-r
和-v
命令,但输出gif的质量比原始png文件低得多。如何保持给定png文件的gif质量?
-framerate 60 -r 60
。检查生成的GIF并使用ImageMagick工具输入图像,例如identify
尝试找出正在发生的情况。
您可以使用imagemagick软件包中包含的名为convert的程序。它是命令行驱动的,但是非常易于使用。通过软件中心安装它,或转到命令提示符并键入
sudo apt-get install imagemagick
现在创建.gif。
convert -delay 100 -size 100x100 xc:SkyBlue \
-page +5+10 balloon.gif -page +35+30 medical.gif \
-page +62+50 present.gif -page +10+55 shading.gif \
-loop 0 animation.gif
*请注意,以上示例直接来自Image Magick示例
convert -delay 20 -loop 0 *.png out.gif
循环播放GIF。