我正在利用 AWS Lambda示例脚本使用 Node.js 和 ImageMagick/GraphicsMagick 库来调整 JPG 图像的大小。我想做一个简单的修改,在调整大小后将图像从 JPG 转换为 WebP 格式。(GraphicsMagick 不支持 WebP,但 ImageMagick 支持,它是脚本中的子类)。根据此处缓冲区部分中的示例(将 JPG 转换为 PNG),这应该可以通过以下代码块实现。
gm('img.jpg')
.resize(100, 100)
.toBuffer('PNG',function (err, buffer) {
if (err) return handle(err);
console.log('done!');
})
当我在本地 Node.js 安装中运行该代码块(用 WebP 替换 PNG)时,它可以工作。
但是,当我修改 AWS Lambda示例脚本的转换函数(见下文)并在 AWS 上执行它时,我收到以下“流产生空缓冲区”错误:
Unable to resize mybucket/104A0378.jpg and upload to mybucket_resized/resized-104A0378.jpg due to an error: Error: Stream yields empty buffer
修改了 transform() 函数(参见带有 'webp' 的行):
function tranform(response, next) {
gm(response.Body).size(function(err, size) {
// Infer the scaling factor to avoid stretching the image unnaturally.
var scalingFactor = Math.min(
MAX_WIDTH / size.width,
MAX_HEIGHT / size.height
);
var width = scalingFactor * size.width;
var height = scalingFactor * size.height;
// Transform the image buffer in memory.
this.resize(width, height)
.toBuffer('webp', function(err, buffer) {
if (err) {
next(err);
} else {
next(null, response.ContentType, buffer);
}
});
});
}
我意识到 response.ContentType 仍然等于 image/jpeg,但我认为这在这里不起作用。另外,我意识到我可能应该在调整大小之前转换为 WebP,但是......小步骤!
有任何想法吗?