我正在尝试在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 });
答案 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();
//...