从一组 jpeg 图像创建动画 gif

Posted

技术标签:

【中文标题】从一组 jpeg 图像创建动画 gif【英文标题】:Create animated gif from a set of jpeg images 【发布时间】:2011-04-10 23:20:45 【问题描述】:

我需要可以在 Windows 7 上编写脚本的东西。此图像将用于横幅。

【问题讨论】:

需要jpeg吗? jpeg->anim gif 可能会出现不想要的闪烁伪影,压缩比更差。您应该使用无损 -> gif 或 gif->gif 以获得最佳质量结果。 @tenfour - 尽管您指出的内容完全有效,但这不一定是经验法则。更重要的是帧共享相似的颜色,因为如果它们不共享,那么在帧之间共享的 GIF 图像的最多 256 种颜色的调色板将产生糟糕的结果,无论输入格式如何,并且经常让人们想知道“为什么它出来颗粒状?!” 使用图片IMG-001.jpgIMG-002.jpg等(带有3数字),每秒显示4图片,只需使用以下命令即可获得GIF格式的结果:ffmpeg -f image2 -framerate 4 -i "IMG-%03d.jpg" Output.gif 【参考方案1】:

您可以通过ffmpeg 做到这一点

先将图片转换成视频:

ffmpeg -f image2 -i image%d.jpg video.avi

(这会将图像从当前目录(名为 image1.jpg、image2.jpg...)转换为名为 video.avi 的视频文件。)

然后把avi转成gif:

ffmpeg -i video.avi -pix_fmt rgb24 -loop_output 0 out.gif

你可以得到windows binaries for ffmpeg here。


您也可以使用mplayer 做类似的事情。见Encoding from multiple input image files。

我认为命令行应该是这样的:

mplayer mf://*.jpg -mf w=800:h=600:type=jpg -vf scale=160:120 -vo gif89a:fps=3:output=out.gif

(其中 800 和 600 是您的源宽度和高度,160 和 120 是目标宽度,height.out.gif 是您的目标文件名)


我刚刚测试了这两个,它们都工作正常。然而,我从 mplayer 获得了更好的结果,因为我能够指定分辨率和帧速率。您的里程可能会有所不同,如果您查看的话,我相信您可以找到更多 ffmpeg 选项。

【讨论】:

这有一个很好的谷歌搜索评级,所以如果你想用零作为数字前缀,请使用%04d(数字4将使用4个前缀为0的数字位置) 找不到名称为 image1d.jpg 的文件!尝试使用 cmd 绝妙的答案,只是让目前尝试使用它的任何人都知道将 .avi 转换为 .gif 的新标志是 -loop,选项为 0 表示无限循环。我还认为 rgb 配置文件标志(并不是说我对颜色配置文件一无所知,这让我的缩略图上有一个蓝色的点网格 由于 avi 使用有损压缩,转换为 avi 不会降低质量吗? @caw 我试过了。但是 ffmpeg 在 gif 中引入了一些工件。视频上的一些点/斑点。知道为什么吗?【参考方案2】:

ffmpeg.avi.avi.gif 有效,但唯一需要注意的是是您的图像必须以完美的递增数字顺序命名才能正常工作,没有间隙。我编写了一个快速的 python 脚本来相应地重命名我的所有图像,以便这个 ffmpeg 配方可以工作:

import os

files = [ f for f in os.listdir('.') if os.path.isfile(os.path.join('.',f)) and f.endswith('.jpg') ]
for i, file in enumerate(sorted(files)):
    os.rename(file, 'image%03d.jpg' % i)

然后我偶然发现了一种比 ffmpeg 更简单的方法来进行转换,它只是使用像这样的 ImageMagick 的命令行转换工具

convert image%03d.jpg[0-198] animated_gif.gif

没有比那些人更简单的了。

这里的要点:https://gist.github.com/3289840

【讨论】:

"图像必须以完全递增的数字顺序命名" - 我猜你不知道-pattern_type glob,它允许使用任何名称的文件作为输入,例如例如,将当前目录中的所有 png 转换为 gif:ffmpeg -framerate 1/10 -pattern_type glob -i '*.png' output.gif【参考方案3】:

使用 ImageMagick:

convert *.png a.gif

【讨论】:

也看这里:***.com/questions/5508945/… 我在使用 .png 文件时遇到了质量问题(因为透明度和分层),这些问题通过使用 .jpg 来解决 您可以使用-delay 设置每张图片的显示时长。请注意,该值以 1/100 秒为单位给出,即-delay 100 导致每秒一帧的速率。 convert -delay 100 *.jpg Output.gif 这样的命令可以正常工作,但生成的文件大小似乎比ffmpeg 更大,即使使用-layers optimize 也是如此。【参考方案4】:

Simon P Stevens' answer 差点把我带到那里:

ffmpeg -f image2 -i image%d.jpg video.avi
ffmpeg -i video.avi -pix_fmt rgb24 -loop_output 0 out.gif

让我们看看我们是否可以整理一下。

不需要通过 avi。 -pix_fmtrgb24 无效,-loop_output 选项可防止循环,这是我不想要的。我们得到:

ffmpeg -f image2 -i image%d.jpg out.gif

我的输入图片标有一个零填充的 3 位数字,我有 30 个(image_001.jpg、image_002.jpg、...),所以我需要修复格式说明符

ffmpeg -f image2 -i image_%003d.jpg out.gif

我输入的图片来自我的手机摄像头,它们太大了!我需要缩小它们。

ffmpeg -f image2 -i image_%003d.jpg -vf scale=531x299 out.gif

我还需要将它们顺时针旋转 90 度

ffmpeg -f image2 -i image_%003d.jpg -vf scale=531x299,transpose=1 out.gif

这个 gif 将在帧之间以零延迟播放,这可能不是我们想要的。指定输入图像的帧率

ffmpeg -f image2 -framerate 9 -i image_%003d.jpg -vf scale=531x299,transpose=1 out.gif

图片有点太大了,所以我将裁剪出 100 像素的天空。转置使这变得很棘手,我使用旋转后的 x 和 y 值:

ffmpeg -f image2 -framerate 9 -i image_%003d.jpg -vf scale=531x299,transpose=1,crop=299,431,0,100 out.gif

最终结果 - 我可以与全世界分享我的伴侣令人敬畏的面部表情:

【讨论】:

%003d ffmpeg 将其替换为路径 - image_C:/user/... 很好的答案!太糟糕了,它没有两步调色板优化:superuser.com/a/556031/142943 如果您的图像索引不是从零开始,请使用-start_number xxx 选项。 superuser.com/a/666994/999889 我的图像是合成的(即绘图),由于某些原因,当我使用 ffmpeg 时,我不知道生成的 gif 文件中有一些黄线;不过,我在使用 ImageMagick convert 命令时没有遇到这个问题。 image2 是 ffmpeg 解复用器的名称(读取输入的位)。 image2 提供-i 中使用的文件通配符,并且知道如何将文件作为视频源读取。见manpages.org/ffmpeg【参考方案5】:

根据 Simon P Stevens 和 dwurf 的回答,我想出了这个简化的解决方案:

ffmpeg -f image2 -framerate 1 -i image%d.jpg video.gif

这导致每张图像的速度为 1 秒。根据您的需要调整framerate 的值。

【讨论】:

【参考方案6】:

我只想补充dwurf 的答案,这将生成一个带有标准 256 色调色板的 gif,看起来不太好看。

我找到了two blog-posts 并根据我的需要对其进行了调整,以便通过为动画使用自定义调色板来提高视觉质量:

生成调色板:

ffmpeg -f image2 -i image%d.jpg -vf scale=900:-1:sws_dither=ed,palettegen palette.png

将图像转换为具有所需帧率的常规视频,因为第三个命令仅适用于单个输入视频而不是一堆图像

ffmpeg -f image2 -framerate 1.2 -i image%d.jpg video.flv

现在用生成的调色板将生成的视频转换成更漂亮的 gif:

ffmpeg -i video.flv -i palette.png -filter_complex "fps=1.2,scale=900:-1:flags=lanczos[x];[x][1:v]paletteuse" video.gif

【讨论】:

这太棒了!学习调色板非常有趣。

以上是关于从一组 jpeg 图像创建动画 gif的主要内容,如果未能解决你的问题,请参考以下文章

PHP - 从两个 JPEG 图像创建简单的动画 GIF?

如何在matlab中从一组图像中制作gif图像?

如何在 Android 中从 JPEG 创建动画 GIF(开发)

如何从一堆jpgs创建gif动画

如何在 Java 中创建动画 gif?

PHP 载入图像 imagecreatefrom_gif_jpeg_png 系列函数