【问题标题】:Only in AWS Lambda: ImageMagick Error: Command failed: convert: no decode delegate for this image format仅在 AWS Lambda 中:ImageMagick 错误:命令失败:转换:没有此图像格式的解码委托
【发布时间】:2019-05-15 22:36:29
【问题描述】:

我的网站尝试转换的其中一张图片出现此 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 运行时环境中执行此操作。有没有办法解决这个问题?

【问题讨论】:

  • 您是否已将 Image Magik 安装到您部署的 Lambda 包中?有关详细信息,请参阅this post
  • 您可能必须在 AWS 中提供 ImageMagick convert 的完整路径,因为它可能不会使用与基本操作系统(例如 MAC)相同的 ENVIRONMENT 变量。
  • 失败图像的真实格式是什么?实际上有两种 JPEG 格式:JFIF(“传统”,由图像编辑器制作)和 Exif(最近,由相机制作)。 file 命令将区分它们(JPEG image data, Exif standardJPEG image data, JFIF standard 1.01)。或者文件是 Jpeg2000,甚至是不相关的文件(PNG、GIF、TIFF...)。
  • @stdunbar 我不明白你的意思。 ImageMagick 安装在本地,它在我的 package.json 中。我觉得 Lambda 安装使用就够了。
  • @fmw42 我的问题中显示的错误意味着 ImageMagick 正在工作,但它缺少某个图像的解码委托。但我不太清楚如何将这样的委托添加到 Lambda。我只相信 ImageMagick 自带的,对吧?

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


【解决方案1】:

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

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

【讨论】:

  • 感谢您的回答。我知道图像的真实类型。一些用户只需重命名文件即可上传它们。这里的问题是 ImageMagick 确实识别图像的真实格式并将其转换为 PNG(我打算这样做)。正如错误所示,由于缺少图像委托,它只是在 AWS Lambda 中没有这样做。挑战只是安装代表来解决这个问题。
【解决方案2】:

经过一些浪费的时间,我发现这是亚马逊默认在 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'

大多数其他答案和 cmets 都专注于完全不相关的事情,即图像文件格式实际上是 webp,当 imagemagick 具有文件格式的内置检测器并且它无论如何都会忽略文件的扩展名时,所以这个info 与 ImageMagick 无关。

让遇到这个问题的其他人开心!!!

【讨论】:

  • 感谢您的回答!我实际上忘记了我当时是如何解决这个问题的 :D 但会记录下来以防万一。
猜你喜欢
  • 1970-01-01
  • 2015-07-12
  • 2012-03-17
  • 1970-01-01
  • 2019-04-25
  • 1970-01-01
  • 2013-10-20
  • 2021-11-05
  • 2016-10-02
相关资源
最近更新 更多