使用 Node.js 中的 GraphicsMagick/ImageMagick 包在 AWS Lambda 中将 JPG 转换为 WebP

lit*_*leK 5 imagemagick amazon-web-services node.js graphicsmagick aws-lambda

我正在利用 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!');
})
Run Code Online (Sandbox Code Playgroud)

当我在本地 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
Run Code Online (Sandbox Code Playgroud)

修改后的 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);
                        }
                    });
            });
        }
Run Code Online (Sandbox Code Playgroud)

我意识到 response.ContentType 仍然等于 image/jpeg,但我认为这在这里不起作用。另外,我意识到我应该在调整大小之前转换为 WebP,但是......宝贝步骤!

有任何想法吗?

Dam*_*ria 3

ImageMagick 必须专门编译为支持 WebP。我的实验似乎表明 AWS Lambda 上的 ImageMagick 不是用 WEBP 编译的:(