仅适用于AWS Lambda:ImageMagick错误:命令失败:convert:此图像格式没有解码委托。

3
我遇到了一个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运行时环境中执行这些操作。有没有什么解决方法?


1
你是否已经将Image Magik安装到你部署的Lambda包中了?更多详细信息请参考这篇帖子 - stdunbar
1
在AWS中,您可能需要提供ImageMagick convert的完整路径,因为它可能不使用与基本操作系统(如MAC)相同的环境变量。 - fmw42
1
失败的图像的真实格式是什么?实际上有两种JPEG格式:JFIF(由图像编辑器生成的“传统”格式)和Exif(由相机生成的较新格式)。file命令可以区分它们(JPEG image data, Exif standardJPEG image data, JFIF standard 1.01)。或者该文件是Jpeg2000,甚至是其他不相关的格式(如PNG、GIF、TIFF等)。 - xenoid
@stdunbar 我不知道你的意思。ImageMagick已经在本地安装并且在我的package.json中了。我认为这应该足够让Lambda安装并使用它。 - Lee Maan
@fmw42,我问题中显示的错误意味着ImageMagick正在工作,但它缺少某个图像的解码委托。但是我不太清楚如何将这样的委托添加到Lambda中。我只相信这一切都与ImageMagick有关,对吗? - Lee Maan
显示剩余6条评论
2个回答

2
不要盲目相信文件扩展名。提供的图片并不是Jpeg格式的。你可以将其下载到另一台系统上,并使用file或其他工具进行检查。在这种情况下,它是WebP图像(WebP是由Google推出的新图像格式)。
混淆的一个可能原因是Web服务器从文件扩展名生成Mime类型,因此WebP图像以image/jpeg的Mime类型返回,这通常会被大多数软件(包括您的浏览器)盲目信任。

感谢你的回答。我知道图片的真实类型。一些用户只是将文件重命名以便上传它们。问题在于ImageMagick无法识别图像的真实格式,并将其转换为PNG(这正是我想做的)。只是在AWS Lambda中由于缺少图像代理而无法这样做,正如错误所示。挑战只是安装代理程序来解决这个问题。 - Lee Maan

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'

大多数其他答案和评论都关注了完全不相关的事情,即图像文件格式实际上是webp格式,而ImageMagick已经内置了文件格式检测器,无论如何它都会忽略文件扩展名,因此这些信息对于ImageMagick来说是无关紧要的。
祝愿任何遇到这个问题的人能够享受!

谢谢你的回答!我实际上忘记了当时是怎么解决那个问题的 :D 但是为了以防万一,我会把这个记录下来。 - Lee Maan

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