仅在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运行时环境中我无法做到这一点。有办法解决这个问题吗?

不要盲目信任文件扩展名。提供的图像不是Jpeg。您可以将其下载到另一个系统,在那里您可以使用file或其他方式进行检查。在目前的情况下,它是一个WebP图像(WebP是谷歌推出的一种新图像格式(。

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

经过一些浪费的时间,我发现这是亚马逊默认在Lambda上内置的ImageMagick中的一个缺陷。它比较旧,没有用于WebP的解码器。如果您使用以下图层作为imagemagik的覆盖层,然后使用它而不是内置图层,它将解决您的问题。

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.000n'

大多数其他答案和评论都集中在一些完全无关的东西上,即图像文件格式实际上是一个webp,而imagemagik内置了文件格式检测器,它无论如何都会忽略文件的扩展名,因此这些信息与imagemagick无关。

享受其他遇到这个问题的人吧!!!

最新更新