You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu上ImageMagick小版本升级致Ruby出现Magick::ImageMagickError

解决ImageMagick安全更新后RMagick RVG添加图片报错问题

问题背景

Ubuntu 22.04服务器将ImageMagick从8:6.9.11.60+dfsg-1.3ubuntu0.22.04.3升级到8:6.9.11.60+dfsg-1.3ubuntu0.22.04.5后,使用RMagick的RVG模块添加图片时触发以下错误:

Magick::ImageMagickError: unable to open image 5335': No such file or directory @ error/blob.c/OpenBlob/2924 [GEM_ROOT]/gems/rmagick-5.5.0/lib/rvg/misc.rb:528:in draw'

仅在调用canvas.image(bullets_graphic)时出现异常,移除该调用后代码可正常运行。当前环境信息:

  • Ubuntu Version: 22.04
  • Ruby Version: 3.2.2
  • MiniMagick Version: 4.13.2
  • RMagick Version: 5.5.0

已尝试重新安装/编译RMagick,问题未解决。

解决方案

1. 升级RMagick到最新兼容版本

该问题属于ImageMagick安全更新后,RMagick 5.5.0版本的RVG模块存在的兼容bug,后续版本已修复。执行以下命令升级:

bundle update rmagick

确认升级至5.6.0及以上版本后重新运行代码即可。

2. 绕开RVG,直接使用Image合成

若暂时无法升级RMagick,可替换RVG的使用逻辑,直接通过Magick的图片合成功能实现需求:

# 替换原RVG代码逻辑
base_image = Magick::Image.new(600, 600) { self.background_color = "white" }
bullets_graphic = ::Magick::Image.read(Rails.root.join("app/assets/images/score_5.png")).first
# 将目标图片合成到基础画布,可调整x、y参数控制图片位置
base_image.composite!(bullets_graphic, 0, 0, Magick::OverCompositeOp)

base_image.format = 'jpg'
base_image.to_blob do |img|
  img.quality = 90
  img.depth = 8
end

3. 临时回退ImageMagick版本(紧急场景)

若需立即恢复服务,可临时回退到之前的ImageMagick版本:

# 安装旧版本
sudo apt install imagemagick=8:6.9.11.60+dfsg-1.3ubuntu0.22.04.3
# 锁定版本防止自动更新
sudo apt-mark hold imagemagick

待RMagick兼容完成后,再执行sudo apt-mark unhold imagemagick && sudo apt upgrade imagemagick解锁并更新。

4. 检查ImageMagick安全策略

虽概率较低,但可排查/etc/ImageMagick-6/policy.xml是否新增了限制规则(如禁止Blob操作、文件读取),若存在可临时调整相关策略(注意评估安全风险)。

内容的提问来源于stack exchange,提问作者Niels Kristian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 20:26:14