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

Imagemagick 如何在考虑累积透明度的情况下提取GIF的第n帧,imagemagick,gif,animated-gif,Imagemagick,Gif,Animated Gif,我知道我可以使用imagemagick将动画gif分解为组成帧 convert my.gif my.png 问题是除了第一帧之外的所有帧都包含大量的透明度,我假设是因为某种差异压缩 我希望第n帧作为一个单独的文件,因为它将在应用第一帧后的所有透明层之后出现在最终渲染中。这是一个非常大(GB)的文件,有1080p帧,所以我不想全部提取,只提取第n帧 我该怎么做?我需要一个非交互式的解决方案。无法100%确定您希望它如何工作,因为每个1080p帧可能对应多个GIF帧,因此您对N的计算可能与Imag

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

convert my.gif my.png
问题是除了第一帧之外的所有帧都包含大量的透明度,我假设是因为某种差异压缩

我希望第n帧作为一个单独的文件,因为它将在应用第一帧后的所有透明层之后出现在最终渲染中。这是一个非常大(GB)的文件,有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

我不知道您的数据-请尝试查看。

谢谢。您能解释一下“每个1080p帧对应的GIF帧可能不止一个”是什么意思吗?作为GIF优化的一部分,ImageMagick决定从1080p帧N到1080p帧N+1的最佳方式。它可能只是在一个GIF框架中存储差异,或者它可以将左上角作为一个“GIF”操作清除,然后重新绘制左上角的一部分作为另一个“GIF”操作,然后在右上角绘制另一个“GIF”操作,然后将中间的东西作为另一个“GIF”操作绘制。现在单个1080p帧有4个GIF“帧”,因此帧编号可能不匹配。