我正在尝试创建一个 AWS Lambda 函数来对图像应用水印效果。原始图像将从 S3 中提取,应用水印并将结果上传回 S3。
我正在使用 sharp使用此代码创建这些组合:
await sharp(inputImage)
.rotate()
.composite([{ input: new Buffer.from(watermark), tile: true, gravity: 'northwest' }])
带有自定义水印的 SVG
watermark = `<svg ... <text x="50%" y="100%" style="font-family:'Open Sans';font-weight:400;font-size:75px;font-style:normal;fill:rgba(128,128,128,1);stroke:none;" text-anchor="middle">${event.watermarkName}</text></g></svg>`;
在 SVG 中有一个文本元素,我动态更改它以包含指定的字符串。例如,我可以将 (c) 公司名称
放在一张图片上,将 (c) John Doe
放在另一张图片上。
代码在我的机器上运行时有效,但是一旦进入具有 Node.js 12.x 运行时的 Lambda 函数,这就是结果
如您所见,我将 Open Sans
指定为要使用的字体。事实上,我将 OpenSans-Regular.ttf
文件放在 /fonts/
中,创建了一个 fonts.conf
文件并设置了一个 FONTCONFIG_PATH='/var/task/fonts'
如 this question 中所述.
尽管如此,字体仍然无法正常工作。有人对我如何解决这个问题有建议吗?
最佳答案
好吧,问 Stackoverflow 帮助我自己找到了答案,所以我分享一下,以防将来有人偶然发现这个问题。
AWS Lambda 本身似乎不支持基本字体。因此,您需要将 onw 字体作为文件包含在部署 zip 文件中。
在我的例子中,这是有效的:
创建一个
/fonts
文件夹并在里面放置所有需要的文件(在我的例子中是OpenSans-Regular.ttf
)。将名为
fonts.conf
的文件放入该文件夹<?xml version="1.0"?> <!DOCTYPE fontconfig SYSTEM "fonts.dtd"> <fontconfig> <dir>/var/task/fonts/</dir> <cachedir>/tmp/fonts-cache/</cachedir> <config></config> </fontconfig>
通过创建环境变量告诉 Lambda 配置文件在哪里
FONTCONFIG_PATH='./fonts'
瞧瞧!
关于amazon-web-services - 在 AWS Lambda 和 Node.js 12.x 中使用自定义字体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63169825/