在 Node.js 中使用带有 Sharp 的流

Using a Stream with Sharp in Node.js

我有一个 Node.js 应用程序。在此应用中,我使用 this API 从 Azure 存储加载图像文件。具体来说,我正在使用 createReadStream 函数。该函数提供了一个从图像中读取的流。现在,我的代码如下所示:

let chunks = [];
let sharp = require('sharp');

let fileStream = this.fileService.createReadStream('[MY_SHARE]', '[MY_DIRECTORY]', '[MY_PICTURE_NAME]', (err, fileResult, res) => {
  console.log('Sharpening image...');
  console.log(imageChunks);

  sharp(chunks).resize(100, 100).toFile('resized.png', function(err1, info) {
    if (err1) {
      console.log('oops');
    }
  });
});

fileStream.on('data', function(chunk) {
  chunks.push(chunk);
});

在此块中,请注意我正在尝试使用 Sharp node module。在 sharp(chunks)... 行之前,我将图像块打印到控制台。在控制台中打印时,我看到以下内容:

[ <Buffer 87 52 4e 47 0d 0a 1a 0a 01 02 04 0d 49 48 44 52 00 00 06 18 00 00 06 0f 08 06 00 00 00 75 c2 f0 a2 00 00 00 04 67 42 4d 41 00 00 b2 8f 0a fc 61 05 00 ... > ]

但是,当我调用 Sharp 时,我收到一条错误消息:

Error: Unsupported input object

根据文档,Sharp Constructor 允许使用字符串或缓冲区。查看如上所示打印到控制台的内容,看起来我正在将缓冲区传递给 Sharp。我误会了什么吗?如果是,是什么?

请更改以下代码行:

  sharp(chunks).resize(100, 100).toFile('resized.png', function(err1, info) {
    if (err1) {
      console.log('oops');
    }
  });

sharp(Buffer.concat(chunks)).resize(100, 100).toFile('resized.png', function(err1, info) {
    if (err1) {
    console.log('oops');
    console.log(err1);
    }
});

这应该可以解决问题。如果我没记错的话,chunks 实际上是一个 Buffer 的数组,而 sharp 库需要一个 Buffer,所以我们需要使用所有数组元素创建一个新缓冲区。