如何在考虑累积透明度的情况下提取 GIF 的第 N 帧

How to extract Nth frame of GIF with cumulative transparencies taken into account

我知道我可以使用 imagemagick 将动画 gif 分解为其组成帧

convert my.gif my.png

问题是除了第一帧之外的所有帧都包含很多透明度,我假设是因为某种差异压缩。

我希望第 N 帧作为一个单独的文件,因为它会出现在应用第一帧之后所有透明层之后的最终渲染中。这是一个非常大(千兆字节)的文件,具有 1080p 帧,所以我不想将它们全部提取,只提取第 N 个。

我该怎么做?我需要一个非交互式解决方案。

不能 100% 确定您希望它如何工作,因为每个 1080p 帧对应的 GIF 帧可能不止一个,因此您对 N 的计算可能与 ImageMagick 不同N的概念。例如,作为优化的一部分,ImageMagick 可能会选择对一个帧进行 2 次部分清除和 2 次进一步覆盖以呈现单个 1080p 帧,这将使您的值每次相差几帧发生了。

无论如何,您可以尝试使用 -coalesce 选项进行试验,该选项会强制 ImageMagick 重新创建渲染完整帧所需的所有部分,然后删除周围的帧。

资源占用最少的选项可能是尝试加载单个帧:

convert a.gif[784] -coalesce frame784.png

下一个最不密集的可能是在你想要的帧之前加载所有帧,而不是费心加载后面的帧:

convert a.gif[0-784] -coalesce -delete 0-783 frame-784.png

资源最密集但最有可能工作的选项可能是加载所有帧,然后删除不需要的帧:

convert my.gif -coalesce -delete 0-783,785--1 frame784.png

我不知道你的数据 - 试试看。