Gm – 利用 gm 修改图片
     发布在:JavaScript      浏览:25      评论:0 条评论

续上一篇:《Puppeteer – AWS Lambda 中使用 puppeteer 页面截图》

由于 AWS Lambda 的性能有限,一些长页面无法直接截图。比如,大于 14000px 高度的页面,程序会直接崩溃。

因此,需要对页面进行分段截图并拼接。

如何分段截图,在上一篇中有详细代码,这里只展示如何在 AWS Lambda 中进行图片拼接。

const gm = require('gm').subClass({imageMagick: true});

/**
 * @name imgThumbnail
 * @description image thumbnail
 * @param {Buffer|String} img image buffer or image path.
 * @param {Number} width
 * @param {Number} height
 * @return {Promise}
 */
exports.imgThumbnail = function imgThumbnail(img, width, height) {
    return new Promise((resolve, reject) => {
        const data = gm(img).resize(width, height).quality(50);
        gmToBuffer(data).then((buffer) => {
            return resolve(buffer);
        }).catch((e) => {
            return reject(e);
        });
    });
};

/**
 * @name imgMerger
 * @description merge image
 * @param {Array} imgArr image buffer array
 * @return {Promise}
 */
exports.imgMerger = function imgMerger(imgArr) {
    return new Promise((resolve, reject) => {
        const data = gm(imgArr.shift()).append(imgArr).setFormat('png');
        gmToBuffer(data).then((buffer) => {
            return resolve(buffer);
        }).catch((e) => {
            return reject(e);
        });
    });
};

/**
 * @name gmToBuffer
 * @param {gm} data
 * @return {Promise}
 */
const gmToBuffer = function gmToBuffer(data) {
  return new Promise((resolve, reject) => {
    data.stream((err, stdout, stderr) => {
      if (err) return reject(err);
      const chunks = [];
      stdout.on('data', (chunk) => chunks.push(chunk));
      stdout.on('end', () => resolve(Buffer.concat(chunks)));
      stderr.on('data', (data) => reject(String(data)));
    });
  });
};
    Responses