有没有一个命令可以获取gif动画中帧的数量?

有没有一个命令可以获取gif图像中的帧数? 我有一些gif图像,我想将它们转换为数组,但我想根据任意输入的gif图像的帧数来限制数组的结构和大小。我曾考虑过使用ImageMagick这样的工具,但目前还没有找到相应的选项。
5个回答

如果您已经安装了ImageMagick,您可以按照以下方式使用它的identify命令。
identify /path/to/image.gif

您将获得每个帧的详细信息。
steeldriver所建议,您可以直接使用%n输出格式指定符获取序列中的图像数量,但令人讨厌的是它似乎会为每个图像打印一次。要获得一个单独的数字,您可以执行以下操作:
identify -format "%n\n" path/to/file.gif | head -1

2糟糕,我是第一个回答并且更新了三次,却没有看到你的回答,而且和我最后一次修改的答案非常相似... - WinEunuuchs2Unix

Exiftool会在其详尽的输出中列出“帧数”作为其中一部分。
这是一个动画GIF文件的命令和输出。
$ exiftool -b -FrameCount giphy.gif
33

gif 的完整 exiftool 输出:

$ exiftool giphy.gif
ExifTool Version Number         : 10.10
File Name                       : giphy.gif
Directory                       : .
File Size                       : 2.1 MB
File Modification Date/Time     : 2018:04:22 21:00:42-04:00
File Access Date/Time           : 2018:04:22 21:01:03-04:00
File Inode Change Date/Time     : 2018:04:22 21:00:52-04:00
File Permissions                : rw-rw-r--
File Type                       : GIF
File Type Extension             : gif
MIME Type                       : image/gif
GIF Version                     : 89a
Image Width                     : 500
Image Height                    : 281
Has Color Map                   : Yes
Color Resolution Depth          : 7
Bits Per Pixel                  : 7
Background Color                : 127
Animation Iterations            : Infinite
XMP Toolkit                     : Adobe XMP Core 5.3-c011 66.145661, 2012/02/06-14:56:27
Creator Tool                    : Adobe Photoshop CS6 (Macintosh)
Instance ID                     : xmp.iid:C312DB1DA6A311E5B8F5D2BA262E999D
Document ID                     : xmp.did:C312DB1EA6A311E5B8F5D2BA262E999D
Derived From Instance ID        : xmp.iid:C312DB1BA6A311E5B8F5D2BA262E999D
Derived From Document ID        : xmp.did:C312DB1CA6A311E5B8F5D2BA262E999D
Frame Count                     : 33
Duration                        : 2.31 s
Image Size                      : 500x281
Megapixels                      : 0.141

3你不需要使用grep来筛选exiftool的输出:每个字段都可以独立打印出来:exiftool dev/slack-emojinator/gifs/yj_batsu.gif -FrameCountexiftool dev/slack-emojinator/gifs/yj_batsu.gif -b -FrameCount只是为了获取值。 - muru
1@muru 谢谢你提供的信息。我会修正答案的。 - L. D. James
这里有一些有用的信息:在Ubuntu(21.10)上,exiftool程序可以在libimage-exiftool-perl软件包中找到,并且可以通过apt install libimage-exiftool-perl进行安装。在Arch Linux(2021)上,它可以在perl-image-exiftool软件包中找到。 - Rudy Matela

一行命令

受到这篇文章的启发,使用以下一行命令:

$ identify drop_caches.gif | wc -l
128

更多详细信息,请使用以下链接:

identify -verbose filename.gif

这个网站允许你上传你的.gif文件,并对其进行多种分析,包括帧数。

ezgif.png


Image Magic提供的convert工具可以将您的.gif转换为单独的.png图像,每个帧都有一个图像:
$ convert -verbose -coalesce drop_caches.gif drop_caches.png
drop_caches.gif[0] GIF 470x940 470x940+0+0 8-bit sRGB 256c 177KB 0.090u 0:00.099
drop_caches.gif[1] GIF 13x1 470x940+398+704 8-bit sRGB 256c 177KB 0.080u 0:00.089
drop_caches.gif[2] GIF 306x620 470x940+144+130 8-bit sRGB 256c 177KB 0.080u 0:00.089
    (... SNIP ...)
drop_caches.gif=>drop_caches-125.png[125] GIF 470x940 470x940+0+0 8-bit sRGB 255c 50.3KB 27.100u 0:24.890
drop_caches.gif=>drop_caches-126.png[126] GIF 470x940 470x940+0+0 8-bit sRGB 254c 48.9KB 27.320u 0:25.089
drop_caches.gif=>drop_caches-127.png[127] GIF 470x940 470x940+0+0 8-bit sRGB 254c 48.9KB 27.480u 0:25.269

FFmpeg的方法:
ffprobe -v warning -show_frames qqq.gif | grep -c '\[/FRAME\]'

Gif视频就是一种视频,所以视频分析工具也可能会有帮助。

我的经验是编译FFMPEG以满足我的需求真的很麻烦,但我非常感谢花费时间来提供这个答案。希望有人会觉得它有用。 - j0h
@j0h,发行版提供的FFmpeg难道不适用于这个吗? - Vi.

如果你安装了ImageMagick,你也可以使用less命令。
less +G image.gif

总帧数是在image.gif[#]...中括号中的最后一个#(从0开始计数);或者可以使用以下方法进行计算:
less image.gif | wc -l

引人入胜…… - j0h