在Node.js中使用带Sharp的Stream

时间:2017-06-26 12:55:35

标签: node.js azure sharp

我有一个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 ... > ]

但是,当我打电话给夏普时,我收到的错误是:

Error: Unsupported input object

根据文档,Sharp Constructor允许String或Buffer。看看如上所示打印到控制台的内容,看起来我正在将缓冲区传递给夏普。我误会了什么吗?如果是这样,是什么?

1 个答案:

答案 0 :(得分:0)

请更改以下代码行:

  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,所以我们需要使用所有数组元素创建一个新的缓冲区。