我正在尝试创建一个 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) Company Name
放在一张图像上,将 (c) John Doe
放在另一张图像上。
代码在我的机器上运行时可以工作,但是一旦进入具有 Node.js 12.x 运行时的 Lambda 函数,这就是结果
如您所见,我指定了
Open Sans
作为要使用的字体。事实上,我将 OpenSans-Regular.ttf
文件放入 /fonts/
,创建了 fonts.conf
文件并设置了 FONTCONFIG_PATH='/var/task/fonts'
,如这个问题中所述。
尽管如此,字体仍然无法工作。有人对我如何解决这个问题有建议吗?
问 Stackoverflow 帮助我自己找到了答案,所以我分享以防将来有人偶然发现这个问题。
AWS Lambda 本身似乎甚至不支持基本字体。因此,您需要将您的字体作为文件包含在部署 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'
瞧!
也为我工作过
FONTCONFIG_FILE="/var/task/fonts.conf"
这个解决方案真的帮助了我,谢谢
环境变量
FONTCONFIG_PATH: /var/task/assets/fonts
fonts.conf
里面/var/task/assets/
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<dir>/var/task/assets/fonts/</dir>
<cachedir>/tmp/fonts-cache/</cachedir>
<config></config>
</fontconfig>