我正在利用 AWS Lambda 示例脚本,使用 Node.js 和 ImageMagick/GraphicsMagick 库来调整 JPG 图像的大小。我想对其进行简单修改,将图像从 JPG 格式转换为 WebP 格式。 (GraphicsMagick 不支持 WebP,但 ImageMagick 支持,该库在脚本中进行了子类化)。根据缓冲区部分此处的示例(将 JPG 转换为 PNG),应该可以通过以下代码块实现。
当我在本地 Node.js 安装中运行该代码块(将 PNG 替换为 WebP),它可以正常工作。
然而,当我修改 AWS Lambda example script 的转换函数(见下文)并在 AWS 上执行时,我收到以下“流产生空缓冲区”错误:
我意识到response.ContentType仍然等于image/jpeg,但我认为这里并没有起到作用。另外,我意识到在调整大小之前,我应该先将其转换为WebP格式,但是...一步一步来!有任何想法吗?
gm('img.jpg')
.resize(100, 100)
.toBuffer('PNG',function (err, buffer) {
if (err) return handle(err);
console.log('done!');
})
当我在本地 Node.js 安装中运行该代码块(将 PNG 替换为 WebP),它可以正常工作。
然而,当我修改 AWS Lambda example script 的转换函数(见下文)并在 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格式,但是...一步一步来!有任何想法吗?