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

5
我正在利用 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 安装中运行该代码块(将 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格式,但是...一步一步来!有任何想法吗?
2个回答

4

我在使用gm和AWS Lambda执行其他操作时也遇到了相同的错误:“流产生空缓冲区”。

结果发现Lambda容器内存不足。

我使用一个经常引发错误的大型图像进行了测试,证实了这个假设。

当我增加Lambda函数的内存时,一切都完美运行。

希望这对您也有所帮助。


1
我也在尝试做同样的事情,并且需要在AWS Lambda上部署。但是为了让它在本地工作,我不得不在我的操作系统中安装graphicsMagick。我想知道你是如何在Lambda上使用它的,因为我们无法在那里安装gm。你能分享一些见解吗? - T Anna

3

需要特别编译ImageMagick以支持WebP格式。我的实验似乎表明,AWS Lambda上的ImageMagick没有编译WEBP :(


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接