使用Node JS将多个JPG文件合成为一个动态GIF

3

我正在尝试将5个特定的JPG文件名导入到一个动画GIF中。我查看了几个库,发现Gif-Encoder。我不太擅长流。我似乎无法弄清楚如何将JPEG解码器的RGB结果导入到编码器的addFrame()方法中。

function createAnimatedGif(jpgPaths, animatedGifPath) {
    let encoder = new GifEncoder(1280, 720);

    let writeStream = fs.createWriteStream(animatedGifPath);
    encoder.pipe(writeStream);
    encoder.writeHeader();

    jpgPaths.forEach(filePath => {
        fs.createReadStream(filePath)
            .pipe(new JPEGDecoder)
            //.pipe(encoder);
            //.pipe(pixels => encoder.addFrame(pixels));
    });

    encoder.finish();
}
1个回答

6

是否必须使用读取流?我使用了“get-pixels”模块并获得了一些成功。

var getPixels = require('get-pixels')
var GifEncoder = require('gif-encoder');
var gif = new GifEncoder(1280, 720);
var file = require('fs').createWriteStream('img.gif');
var pics = ['./pics/1.jpg', './pics/2.jpg', './pics/3.jpg'];

gif.pipe(file);
gif.setQuality(20);
gif.setDelay(1000);
gif.writeHeader();

var addToGif = function(images, counter = 0) {
  getPixels(images[counter], function(err, pixels) {
    gif.addFrame(pixels.data);
    gif.read();
    if (counter === images.length - 1) {
      gif.finish();
    } else {
      addToGif(images, ++counter);
    }
  })
}
addToGif(pics);

不需要gif.read()就可以正常工作...你能解释一下gif.read()的目的吗?它是必要的吗?谢谢。 - wayofthefuture
1
gif-encoder文档中并没有很好地记录,但是如果你阅读'error'事件的文档,它说 当内部缓冲区超出限制时会发出错误。这将在您未读取数据(无论是通过.on('data')还是.read())且无法刷新准备好的数据时发生。所以虽然不是严格必需的,但我使用太多图像时会遇到错误。 - Skabbi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接