如何在NodeJS上使用GraphicsMagick提取GIF的第一帧并将其保存为PNG?

时间:2013-06-19 16:27:14

标签: javascript node.js graphicsmagick

以下是我要执行此操作的步骤:

  1. 用户向服务器提供指向动画gif的链接
  2. 服务器使用“request(url)”来检索文件
  3. 服务器生成gif第一帧的缩略图
  4. 服务器将缩略图上传到Amazon S3
  5. 第3步中存在问题。我无法找到提取gif第一帧的方法。我更喜欢使用GraphicsMagick,但如果你知道其他方式有效,我将非常感激!

    正在使用NodeJS。

2 个答案:

答案 0 :(得分:6)

我不知道为什么这不在文档中,而是其他人answered this here on stackoverflow

因此,您可以将其与文件路径字符串或流/缓冲区一起使用,如下所示:

对于文件:

gm('/path/to/animated.gif')
.selectFrame(0)
.write('/path/to/firstframe.png', function(err){
    if (err) print('  :(  ');
})

对于流/缓冲区:

gm(streamOrBuffer)
.selectFrame(0)
.write('/path/to/firstframe.png', function(err){
    if (err) print('  :(  ');
})

在文档中,他们说你需要将路径字符串更改为类似于'/path/to/animated.gif[0]'的字符串,以便更具体地选择您想要选择的帧,但我在没有指定框架的情况下测试了该代码,并且工作正常(使用gm@1.21.1和ImageMagick 6.7.7-10 2014-03-06)。此外,他们在文档中使用的内容(不使用selectFrame)也不起作用。它最终崩溃并在整个过程中创建了整个gif的几个png帧。

为什么他们没有记录 selectFrame ,但还是超出了我。正如他们在引用的链接中所指出的,这是一个未解决的问题wondering precisely that

答案 1 :(得分:1)

由于我无法让它在服务器端工作,我最终只是将.gif绘制到<canvas>元素以“模拟”提取.gif的第一帧。这给了我暂停的GIF。