Node.js 无服务器从 URL 获取 img 宽度

Node.js serverless getting img width from URL

我目前 运行 一个 Google 云函数,我正在尝试获取给定远程 URL 的图像的宽度。我在做这件事时遇到了麻烦。我试过使用 axios 获取数据,但我不知道如何处理这些数据。我尝试过使用 GraphicsMagick 和 Sharp,但两者似乎都无法接收远程 URLs。 GraphicsMagick 似乎与 Cloud Functions 不兼容

这是我目前拥有的代码:

let res = await axios({ url: url, method: "get", timeout: 8000 });
let imgData = Buffer.from(res.data, "binary").toString("base64")
const imgInfo = await sharp(imgData).toBuffer();

严重错误:

[Error: Input file contains unsupported image format]

不是很多,但我一直无法让 gm 或 sharp 成功工作。如果您知道获取图像 height/width 的更好方法,请告诉我。

解决方案 进一步研究下面的解决方案,我所做的是:

        let data = await checkUrl(images[i].attrs.src, url);
        let imgBuffer = Buffer.from(data, "binary");
        let imgBufferInfo = await sharp(imgBuffer)
          .metadata()
          .then(function (metadata) {
            return metadata;
          })
          .catch(function (err) {
            return err;
          });
        console.log("imgBuffer: " + imgBufferInfo.width);

我找到了模块并且运行它。 https://github.com/lovell/sharp

根据输入创建的Sharp对象的输入值不同。 当执行缓冲区作为输入时,数据存储在 inputbuffer 中,当执行 Base64 文本作为输入时,数据存储在 fileinput.


在toBuffer()的情况下,可以解释input(buffer),但无法解释input(file)格式

我不知道你想要什么,但你只需要 toBuffer() 操作,将输入创建为缓冲区并使用它。


这里是示例代码和日志

const fs = require('fs')
const sharp = require('sharp')

fs.readFile('profile.png', async (err, data) => {
    let imgBuffer = Buffer.from(data, 'binary');
    let imgBase64 = imgBuffer.toString('base64');

    const imgBufferInfo = await sharp(imgBuffer);
    console.log(imgBufferInfo); // --- [1]

    const imgBase64Info = await sharp(imgBase64);
    console.log(imgBase64Info); // --- [2]

    const result = await imgBufferInfo.toBuffer();
    console.log(result);
    // <Buffer 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 01 3f 00 00 01 23 08 02 00 00 00 cb d0 91 1c 00 00 00 09 70 48 59 73 00 00 0b 36 00 00 0b 36 01 ... 159137 more bytes>

    console.log(imgBuffer);
    // <Buffer 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 01 3f 00 00 01 23 08 02 00 00 00 cb d0 91 1c 00 00 00 09 70 48 59 73 00 00 0b 36 00 00 0b 36 01 ... 159137 more bytes>
});

[1] imgBufferInfo 锐化对象

Sharp {
  ...
  options: {
    ...
    input: {
      failOnError: true,
      limitInputPixels: 268402689,
      sequentialRead: false,
      buffer: <Buffer 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 01 3f 00 00 01 23 08 02 00 00 00 cb d0 91 1c 00 00 00 09 70 48 59 73 00 00 0b 36 00 00 0b 36 01 ... 123176 more bytes>
    }
  }
}

[2] imgBase64Info 锐化对象

Sharp {
  ...
  options: {
    ...
    input: {
      failOnError: true,
      limitInputPixels: 268402689,
      sequentialRead: false,
      file: 'iVBORw0KGg...5ErkJggg=='
    }
  }
}