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

Converting a JPG to WebP in AWS Lambda using GraphicsMagick/ImageMagick packages in Node.js

我正在利用 AWS Lambda example script to resize a JPG image using Node.js and ImageMagick/GraphicsMagick libraries. I want to make a simple modification to convert the image from a JPG to a WebP format after the resize. (GraphicsMagick does not support WebP, but ImageMagick does, which is subclassed in the script). This should be possible with the following block of code, as per the example in the Buffers section here(可将 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 example script 的转换函数(见下文)并在 AWS 上执行它时,我收到以下 "Stream yields empty buffer" 错误:

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 但是......婴儿步骤!

有什么想法吗?

我在使用 gm 和 AWS lambda 的其他操作中遇到了同样的错误,"Stream yields empty buffer"。

结果是 lambda 容器 运行 内存不足。

我使用不断抛出错误的大图像测试了这个假设。

当我增加 lambda 函数的内存时,一切都运行良好。

希望这对你也有帮助

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