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 安装中运行该代码块(用 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,但是......小步骤!

有任何想法吗?

4

2 回答 2

4

在使用 gm 和 AWS lambda 的其他操作中,我遇到了相同的错误“流产生空缓冲区”。

结果是 lambda 容器内存不足。

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

当我增加 lambda 函数的内存时,一切正常。

希望这对您也有帮助

于 2015-12-25T20:04:58.537 回答
3

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

于 2017-04-29T17:08:34.263 回答