仅在AWS Lambda中:ImageMagick错误:命令失败:转换:此图像格式无解码委托

时间:2018-12-14 16:20:32

标签: node.js amazon-web-services aws-lambda imagemagick

我的网站尝试转换的其中一张图片出现ImageMagick错误:

{ Error: Command failed: convert: no decode delegate for this image format `/tmp/925bf249f8297827f51f0370642eb560.jpg' @ error/constitute.c/ReadImage/544.
convert: no images defined `/tmp/abdf362d-f7eb-435f-bafe-5a134be0235f.png' @ error/convert.c/ConvertImageCommand/3046.
at ChildProcess.<anonymous> (/var/task/node_modules/imagemagick/imagemagick.js:88:15)
at emitTwo (events.js:106:13)
at ChildProcess.emit (events.js:191:7)
at maybeClose (internal/child_process.js:886:16)
at Process.ChildProcess._handle.onexit (internal/child_process.js:226:5) timedOut: false, killed: false, code: 1, signal: null }

奇怪的是,它仅在我的AWS Lambda函数中发生,而不在我的机器(Mac)中发生。我正在阅读有关版本控制,重新安装ImageMagick以及其他内容的信息,但是在Lambda运行时环境中无法做到这一点。有什么办法解决吗?

2 个答案:

答案 0 :(得分:2)

不要盲目相信文件扩展名。提供的图片不是Jpeg。您可以将其下载到另一个系统,在其中可以使用file进行检查。在当前情况下,它是WebP图像(WebP是Google推送的新图像格式)。

造成混乱的一个可能原因是Web服务器从文件扩展名生成Mime类型,因此WebP图像返回的是image / jpeg的mime类型,大多数软件通常都会盲目地信任它(包括您的浏览器)。

答案 1 :(得分:1)

经过一些浪费的时间,我发现这是默认情况下亚马逊在Lambda上内置的ImageMagick的一个缺陷。它比较老,没有WebP解码器。如果您使用以下图层作为imagemagick的覆盖层,然后使用它代替内置图层,则可以解决您的问题。

https://github.com/serverlesspub/imagemagick-aws-lambda-2

在覆盖上一层之前,我得到了...

b"identify: no decode delegate for this image format `/tmp/downloaded_file' @ error/constitute.c/ReadImage/544.\n"

之后...

b'/tmp/downloaded_file WEBP 740x493 740x493+0+0 8-bit sRGB 377646B 0.000u 0:00.000\n'

大多数其他答案和评论都集中在完全不相关的内容上,即当imagemagick具有文件格式的内置检测器并且无论如何都忽略文件扩展名时,图像文件格式实际上是webp。信息与ImageMagick无关。

享受遇到此问题的其他人!