使用node.js和gm

时间:2015-07-27 00:12:18

标签: node.js imagemagick aws-lambda

我正在尝试在AWS Lambda函数中调整图像(从S3下载)的大小和水印。

调整大小部分运行良好,基于AWS Lambda“入门”项目的示例代码。

现在,我在向文件添加水印时遇到问题。

在我的本地系统上,我可以这样做:

gm('martinrose.jpg')
.draw(['image Over 0,0 0,0 wm-bas.png'])
.write('brol.jpg', function(e){
 console.log(e||'done'); 
}); 

它没有问题。

在Lambda环境中,我将wm-bas.png文件添加到上传到亚马逊的zip文件中,它似乎是由我的js代码(我使用lstatSync测试)找到的,但真正的水印不起作用。

以下是我所做的相关部分:

gm(response.Body).size(function(err, size) {
    var scalingFactor = Math.min(
        newSize / size.width,
        newSize / size.height
    );
    var width  = scalingFactor * size.width;
    var height = scalingFactor * size.height;

    var fs = require('fs');
    var stats = fs.lstatSync('wm-bas.png');
    console.log(stats); // this outputs meaningful info, so, the file exists

    var ctx = this.resize(width, height);//this works

    if (shouldWatermark)
    {   
        console.log("trying to watermark");
        ctx = ctx.draw(['image Over 0,0 0,0 wm-bas.png']) //this doesn't work, although the previous log is written
    }

    ctx.toBuffer(imageType, function(err, buffer) 
        {
            if (err) {
                next(err);
            } else {
                next(null, response.ContentType, buffer);
            }
        }
    );
});

我错过了什么?为什么这不起作用?它与我保存在缓冲区而不是文件中的事实相关吗?

我使用此代码导入gm,BTW:

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

2 个答案:

答案 0 :(得分:2)

您需要将所有node_modules打包到Lambda部署。在项目中本地安装模块,并使用Lambda代码打包它们。另一个非常重要的事实是Amazon Lambda仍然依赖于已安装的系统库。您的Node.js module可能正在使用可能未在执行Lambda的系统上安装的库,您需要使用Lambda部署打包所有内容。

请参阅此官方文章,了解模块和 Node.js packages in Lambda

答案 1 :(得分:0)

在使用Nodejs lambda函数添加带有自定义字体的文本水印之前,我曾使用过“ sharp”库。我在“您可以阅读Watermark with an AWS lambda

的媒体上写了一个故事
//...
const textedSVG = Buffer.from(`<svg xmlns="http://www.w3.org/2000/svg" 
xml:lang="en"
height="40"
width="200">
<text
font-family="MyFont"
font-style="italic"
x="0" y="20" font-size="16" fill="#fff">
${process.env.WATERMARK_TEXT}
</text></svg>`);
let imgDst = sharp(origimage.Body);

var buffer = await imgDst
 
  .composite([
    {
      input: textedSVG,
      gravity: "southeast",
    },
  ])
  // Use the Sharp module to resize the image and save in a buffer.
  .resize(width)
  .jpeg({ quality: 70 }) //decrease the image quality
  .toBuffer();
//...