Node.js 获取远程图片的长和宽

image-size 模块 提供了一种方法:

let url = require('url');
let http = require('http');
 
let sizeOf = require('image-size');
 
let imgUrl = 'http://my-amazing-website.com/image.png';
let options = url.parse(imgUrl);
 
http.get(options, function (response) {
  let chunks = [];
  response.on('data', function (chunk) {
    chunks.push(chunk);
  }).on('end', function() {
    let buffer = Buffer.concat(chunks);
    console.log(sizeOf(buffer));    // { width: 100, height: 100, type: 'png' }
  });
});

Async/await 形式:

function test() {
  return new Promise((resolve, reject) => {
    http.get(imgUrl, (response) => {
      let chunks = [];
      response.on('data', (chunk) => {
        chunks.push(chunk);
      }).on('end', () => {
        let buffer = Buffer.concat(chunks);
        resolve(sizeOf(buffer));
      });
    }).on('error', (error) => {
      reject(error);
    });
  });
};

(async () => {
  try {
    console.log(await test());
  } catch (error) {
    console.log(error);
  }
})();

request 模块实现:

request({
  url: imgUrl,
  encoding: null
}, function(err, res, body) {
  let buffer = body;
  console.log(sizeOf(buffer));
});

request-promise 模块实现:

async function test() {
  let result = await rp({url: imgUrl,
    encoding: null});
  let buffer = result;
  console.log(sizeOf(buffer));
}

test();

注意:按照 request 官方的说法

If null, the body is returned as a Buffer。 如果设置 encoding 为 null,那么返回的 body 就是 buffer。

request 库默认的 encoding 是 utf8,所以如果不传 encoding 这个参数,响应后会按 utf8 再编码。

buffer 默认(未被encoding前)低层是UInt8Array实现的。并不是按binary编码的。

// request 源码
// https://github.com/request/request/blob/b12a6245d9acdb1e13c6486d427801e123fdafae/request.js#L1136
if (self.encoding !== null) {
  response.body = response.body.toString(self.encoding)
}
// 这样就是回调前 toString('binary'),而 sizeOf 需要的是默认的(未)编码buffer
request({
  'url': imgUrl,
  'encoding': 'binary'
}, function (err, res, body) {
  console.log(sizeOf(Buffer.from(body, 'binary')));
})

binary也是诸多编码方式之一,与base64 hex utf8类似

另一点binaryutf8不同的是,utf8编码后不能转回原始的二进制,见例子

你可能感兴趣的:(Node.js 获取远程图片的长和宽)