使用subprocess调用ImageMagick convert,从BytesIO输入图片遇参数错误
解决ImageMagick
-liquid-rescale 参数错误问题 核心问题分析
你遇到的Wrong parameter: -liquid-rescale错误主要来自两个方面:
-liquid-rescale参数格式错误:该选项的正确语法是宽度百分比x高度百分比!,你当前的写法{x}x{y}%!会被解析成无效格式(比如45x45%!),正确格式应为{x}%x{y}%!。- 缺少依赖库:
-liquid-rescale是基于LibLQR(Liquid Rescale Library)的扩展功能,若系统未安装该库,ImageMagick会不识别此参数。
修复步骤
1. 修正命令参数格式
修改-liquid-rescale的参数写法,确保宽度和高度都带百分比符号:
command = [ "convert", # 若为新版ImageMagick,替换为"magick" "pipe:0", "-liquid-rescale", f"{x}%x{y}%!", # 修正为带双百分比的格式 "-resize", f"{w}x{h}!", "pipe:1", ]
2. 安装LibLQR依赖库
根据你的系统执行对应的安装命令:
- Debian/Ubuntu 系列:
sudo apt-get update && sudo apt-get install liblqr-1-0 imagemagick - CentOS/RHEL 系列:
sudo yum install liblqr imagemagick - macOS(Homebrew):
brew install liblqr imagemagick
3. 验证ImageMagick是否支持-liquid-rescale
运行以下命令检查功能是否可用:
convert -list operator | grep liquid-rescale # 或查看版本信息里的依赖 convert -version
如果输出中包含liquid-rescale或LQR,说明功能已启用。
4. 可选:适配新版ImageMagick
若你的系统安装的是ImageMagick 7+,默认命令已从convert改为magick,需将命令中的"convert"替换为"magick"。
修复后的完整代码
# Distort function using imagemmagick def distort(image, x=45, y=45): from PIL import Image from io import BytesIO import subprocess import traceback import logging logger = logging.getLogger(__name__) img = Image.open(BytesIO(image)) w, h = img.size command = [ "convert", # 若为ImageMagick7+,替换为"magick" "pipe:0", # Input from stdin "-liquid-rescale", f"{x}%x{y}%!", # 修正参数格式 "-resize", f"{w}x{h}!", "pipe:1", # Output to stdout ] try: process = subprocess.Popen( command, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE ) stdout, stderr = process.communicate(image) if process.returncode != 0: logger.info(f"ImageMagick error: {stderr.decode(encoding='latin-1')}") return None return stdout except Exception: traceback.print_exc() return None
内容的提问来源于stack exchange,提问作者Creeper
相关产品推荐
相关产品推荐

