【问题标题】:Node.js serverless getting img width from URLNode.js 无服务器从 URL 获取 img 宽度
【发布时间】:2021-03-28 20:12:57
【问题描述】:

我目前正在运行一个谷歌云函数,并试图在给定远程 URL 的情况下获取图像的宽度。我很难做到这一点。我曾尝试使用 axios 获取数据,但我不知道如何处理数据。我曾尝试使用 GraphicsMagick 和 Sharp,但两者似乎都存在接收远程 URL 的问题。尤其是 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 成功工作。如果您知道获取图像高度/宽度的更好方法,请告诉我。

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

        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);

【问题讨论】:

标签: node.js sharp


【解决方案1】:

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

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


在 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=='
    }
  }
}

【讨论】:

  • 您好,请您看一下这个问题,非常感谢任何可能的帮助。stackoverflow.com/questions/65465145/…
  • 关于如何将该缓冲区转换为文件并将其返回给用户而不将其保存在服务器的磁盘存储中的任何想法
猜你喜欢
  • 2020-06-08
  • 2011-12-15
  • 2014-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-15
  • 1970-01-01
  • 2019-08-10
相关资源
最近更新 更多