May*_*hux 132 command-line image-processing gif
我想.gif
从一组给定的.jpg
图片中制作动画图片。
我更喜欢从命令行执行此操作,因此非常欢迎命令行工具。
May*_*hux 144
您可以使用ImageMagick包。使用以下命令安装它:
sudo apt-get install imagemagick
Run Code Online (Sandbox Code Playgroud)
现在,您可以使用以下方法gif
从图片数量( jpg
)创建一个:
convert -delay 20 -loop 0 *.jpg myimage.gif
Run Code Online (Sandbox Code Playgroud)
Nin*_*suo 64
要完成@Maythux 回答:
-resize
选项:就我而言,我有 4608x3456 张图片,32 张图片生成的 gif 超过 300M
convert -resize 20% -delay 20 -loop 0 *.jpg myimage.gif
Run Code Online (Sandbox Code Playgroud)
或者
convert -resize 768x576 -delay 20 -loop 0 *.jpg myimage.gif
Run Code Online (Sandbox Code Playgroud)
*.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
...
Run Code Online (Sandbox Code Playgroud)
由于拍摄速度非常快(10/s),因此它们都有相同的修改时间,ls -t
例如您无法欺骗使用。在 ubuntu 上,您可以ls -v
改为使用,例如:
convert -resize 768x576 -delay 20 -loop 0 `ls -v` myimage.gif
Run Code Online (Sandbox Code Playgroud)
不过,在 Mac OS X 上按数字排序非常棘手,我想您需要构建一个自定义脚本。
Cir*_*郝海东 28
ffmeg 解决方案 + 测试数据
从 Ubuntu 18.10、ffpmeg 4.0.2-2、ImageMagick 6.9.10-8 开始,我发现 ffmpeg 比 ImageMagick 快得多,并且使用的内存少得多。
最简单的转换命令是:
ffmpeg \
-framerate 60 \
-pattern_type glob \
-i '*.png' \
-r 15 \
-vf scale=512:-1 \
out.gif \
;
Run Code Online (Sandbox Code Playgroud)
您可以通过以下方式获取我的测试数据:
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
Run Code Online (Sandbox Code Playgroud)
测试数据是通过以下方式生成的:https : //stackoverflow.com/questions/3191978/how-to-use-glut-opengl-to-render-to-a-file/14324292#14324292,包含 256 张 1024x1024 PNG 图像。
这是您现在可以直接在浏览器中生成的另一个测试数据!/sf/ask/1346470051/#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 与 ffmpeg 基准测试
为了让 ImageMagick 工作,我首先必须修改它的磁盘和内存限制,/etc/ImageMagick-6/policy.xml
解释如下:https : //superuser.com/questions/1178666/imagemagick-convert-quits-after-some-pages
我比较了命令:
/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 \
;
Run Code Online (Sandbox Code Playgroud)
这些命令被构造为产生尽可能接近的输出,以使比较有效:
/usr/bin/time -v
:用于查找最大内存使用量,如:https : //stackoverflow.com/questions/774556/peak-memory-usage-of-a-linux-unix-process
-deconstruct
:GIF 图像可以只包含前一帧的最小修改矩形,以使 GIF 变小。
ffmpeg
默认情况下计算这些差异,但 ImageMagick 不会,除非-deconstruct
使用。
您基本上每次都希望在 ImageMagick 中使用该选项。
我们可以通过以下方式观察差异:
identify out.gif
Run Code Online (Sandbox Code Playgroud)
对于压缩版本,所有帧的大小都比初始帧小,例如:
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
Run Code Online (Sandbox Code Playgroud)
在这个例子中,第二帧只是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
Run Code Online (Sandbox Code Playgroud)
对于 ffmpeg:
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:04.41
Maximum resident set size (kbytes): 97172
Run Code Online (Sandbox Code Playgroud)
从中我们看到:
测试硬件:联想 ThinkPad P51 笔记本电脑,英特尔酷睿 i7-7820HQ,32GB(16+16) DDR4 2400MHz SODIMM,512GB SSD PCIe TLC OPAL2。
小智 26
您可以使用通配符让 shell 扩展文件名,而不是修改文件名
convert -resize 50% -delay 10 -loop 0 image_{0..99}.jpg output.gif
Run Code Online (Sandbox Code Playgroud)
che*_*edo 17
您可以使用 GIMP 轻松完成此操作。如果尚未安装,请先安装它
sudo apt-get install gimp
Run Code Online (Sandbox Code Playgroud)
从 GIMP 转到File -> Open as Layers以打开它们自己层上的所有 png。
从这里您可以对图层执行编辑,完成后,转到File -> Export As。在对话框中确保将文件类型设置为 GIF。
从那里您将转到 GIF 导出选项。勾选“作为动画”选项并根据需要设置参数。
修改层的名称,并在括号之间包含以毫秒为单位的延迟,如下所示: (1500ms)
单击“过滤器”菜单,然后单击“动画”,然后单击“动画播放”。
您可以使用 imagemagick 包中包含的名为 convert 的程序。它是命令行驱动的,但非常易于使用。通过软件中心安装它,或转到命令提示符并键入
sudo apt-get install imagemagick
Run Code Online (Sandbox Code Playgroud)
现在创建.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
Run Code Online (Sandbox Code Playgroud)
*请注意,上面的示例直接来自Image Magick 示例
归档时间: |
|
查看次数: |
146011 次 |
最近记录: |