【问题标题】:Generate Animated GIF with GM in Node.js在 Node.js 中使用 GM 生成动画 GIF
【发布时间】:2014-07-06 22:21:31
【问题描述】:

所以我这几天一直在处理这个问题,并且在我准备好寻求帮助时明白了这一点。

我正在尝试使用 graphicsmagic 包在基于 node.js 的应用程序中生成动画 gif。

我已经生成了几张看起来有点像的幻灯片

var slides = [];

for (var i=0; i < 10; i++) {
  var slide = gm(200, 200, '#000000')
    .fill('#ffffff')
    .drawText("Slide #"+ i);

  slides.push(slide);
}

我可以将它们转换为流或缓冲区,我可以将它们作为单独的文件保存在硬盘上,并且有点工作

但我的问题是如何在内存中完全将这些幻灯片制作成动画 gif,而不将单个文件保存在硬盘上?

我看到gm 有像#delay()#page() 这样的方法,所以从技术上讲,我可以制作类似的命令

convert -delay 200 -page slide1.gif -page slide2.gif output.gif

我只是不知道怎么做。我想它应该看起来像这样

var end_image = gm(200, 200, '#000000');

end_image.delay(500);

for (var i=0; i < slides.length; i++) {
  slides[i].toBuffer(function(err, buffer) {
    end_image.page(200, 200, ????);
  });
}

end_image.write("output.gif");

基本上我不知道如何将缓冲区转换为gm 的参数

以前有人做过吗?也许还有其他方法?

PS:我也尝试使用 gifencoder 包,并成功地将 gm 缓冲区作为帧输入到 gifencoder 的 API 中,但输出全部损坏。

【问题讨论】:

  • 你能解决这个问题吗?我已经尝试过 gifencoder(听起来就像你所做的那样,但是在尝试将 addFrame() 与缓冲区一起使用时出现分段错误)和 gif 模块(似乎只适用于旧版本的节点)。跨度>
  • @Gregir 不,通过在/tmp 中转储一堆文件并进行炮击来做到这一点
  • 我有使用 JIMP 库执行此操作的代码,但我正在尝试自己使用 GM 执行此操作

标签: javascript node.js image-processing imagemagick graphicsmagick


【解决方案1】:

对于任何寻找 JavaScript 编码器(而不是 C++ 节点模块)的人来说,gifencoder 似乎能够胜任这项工作。他们页面上的一个例子:

const GIFEncoder = require('gifencoder');
const encoder = new GIFEncoder(854, 480);
const pngFileStream = require('png-file-stream');
const fs = require('fs');

const stream = pngFileStream('test/**/frame?.png')
  .pipe(encoder.createWriteStream({ repeat: -1, delay: 500, quality: 10 }))
  .pipe(fs.createWriteStream('myanimated.gif'));

stream.on('finish', function () {
  // Process generated GIF
});

// Alternately, you can wrap the "finish" event in a Promise
await new Promise((resolve, reject) => {
  stream.on('finish', resolve);
  stream.on('error', reject);
});

【讨论】:

    【解决方案2】:

    这可能不是您正在寻找的答案,但我认为以下内容确实回答了问题标题:“如何在 Node.js 中使用 GM 生成动画 gif”

    var Gm = require("gm");
    
    Gm()
    .in("image1.jpg")
    .in("image2.jpg")
    .delay(100)
    .resize(600,600)
    .write("animated.gif", function(err){
      if (err) throw err;
      console.log("animated.gif created");
    });
    

    【讨论】:

    • 感谢您拯救了我的一天。
    【解决方案3】:

    gif 模块可让您创建静态和动画 gif,这可能会对您有所帮助。

    【讨论】:

    • 是的,我看到了,但据我了解,它适用于硬盘驱动器,它将所有内容转储到 /tmp 文件夹中。我需要处理内存中的所有内容,这样我就可以在heroku 上托管say 并且没有HDD io。 (我需要生成很多这样的图像,我不想将它们保存在 HDD 上)
    • 您应该也可以在内存中进行操作。看看this example
    • @Nikolay,您可以在 Heroku 上使用本地文件系统,并且可以编写临时文件。您不能依赖它们在应用重新启动时一直存在。
    • @rane,是的,我就是这么做的,我只是想也许有办法让它完全在内存中工作
    • 另外值得注意的是,node-gif 只适用于
    猜你喜欢
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    • 2019-10-12
    • 2014-07-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    相关资源
    最近更新 更多