ImageMagick在Windows上转换时出现“无效参数”错误。

35

我正在尝试使用ImageMagick命令行工具将PDF文档转换为PNG文件,并从ASP.NET网站进行操作。我创建了一个新的shell进程,并让它执行以下命令:

convert -density 96x96 "[FileNameAndPath].pdf" "[FileNameAndPath].png"

当我在本地机器上使用VS的ASP.NET开发服务器测试网站时,这个代码可以正常运行。当手动输入该命令到shell中时也能很好地工作。但是,在ASP.NET程序创建的shell中运行时,会出现以下错误消息:

Invalid Parameter - 96x96

有没有人知道为什么会发生这种情况,以及该怎么做?

我已经使用不同于ASP.NET进程的用户帐户通过RDP登录服务器并测试了该命令。 我使用的是与我的本地机器完全相同的ImageMagick和Ghostscript安装文件,并在安装过程中激活了将ImageMagick安装路径添加到环境变量中。 自那以后服务器尚未重新启动。


请问您能展示一下完整的命令行吗?(包括真实文件名) - Pekka
你确定你可以从程序创建的shell中调用ghostscript可执行文件吗? - Pekka
完整的命令行是convert -density 96x96 "C:\inetpub\wwwroot\UserData\Pdf\f18196da-571c-45a6-b99b-615fb3edb454.pdf" "C:\inetpub\wwwroot\UserData\Pdf\f18196da-571c-45a6-b99b-615fb3edb454.png"我认为当输入格式为PDF且从shell提示符中工作时,convert会调用gs。我没有测试过。 - rs.
我之前遇到了“无效参数”错误,因为我将一个不同的命令放入了批处理脚本中,而“-fuzz 1%”使用了百分比参数,所以我需要再加一个百分号才能使其正确解析,即“-fuzz 1%%”。 - Jared
6个回答

73
convert也是一款Windows可执行文件的名称,用于将FAT文件系统转换为NTFS。当您未指定可执行文件的完整路径时,请引用以下内容:

...系统首先搜索当前工作目录,然后搜索path环境变量,从左到右依次检查每个目录,查找与给定命令名称匹配的可执行文件名。

"C:\Windows\System32"通常出现在%PATH%变量的开头,导致启动Windows转换实用程序,但是如预期的那样失败并显示“无效参数”错误。

尝试像这样指定ImageMagick的convert.exe的完整路径:

"C:\Program Files\ImageMagick\convert.exe" -density 96x96 "path_and_filename.pdf" "path_and_filename.png"

3
我的 C:\Program Files\ImageMagick\ 中没有包含 convert.exe。请问在新版的 ImageMagick 中要指向哪个 exe 文件? - Scorb
8
我刚刚安装了最新版本,它的名字似乎叫做“magick.exe”。 - Knute Knudsen
8
最近的版本中,在使用convert命令前需要添加magick,例如:magick convert -density 96x96 "[文件名及路径].pdf" "[文件名及路径].png"。 - Juan Rojas

21

正如其他人所述,convert将会指向你的PATH中的另一个程序。相反地,在你的命令之前加上 magick 即可。所以你的命令应该改为:

magick convert -density 96x96 "[FileNameAndPath].pdf" "[FileNameAndPath].png"

3
magick convert 是 ImageMagick 7 的不正确语法。只使用 magick 而不是 magick convert 或 convert。后两者会导致 IM 6 行为。 - fmw42

6
在Windows中实际上存在一个"convert.exe"文件在system32目录下 - 确保你的脚本不会启动那个(也许你的开发机器环境路径设置不同)。

5

我很抱歉回复晚了,因为imagemagick已经更新。现在,如果您想使用“convert”命令,您需要像这样操作:

magick convert "image.png" "document.pdf"

或者

magick convert "image_00*.png" "document.pdf"

用于多张图片的语法。

命令的语法相同,只需在其前面添加magick即可。


1
magick convert 是 ImageMagick 7 的不正确语法。只使用 magick 而不是 magick convert 或 convert。后两者将会给出 IM 6 的行为。 - fmw42

2

还有几个修复这个问题的选项:

  • 编辑你的Path系统变量,将路径指向imagemagick的安装目录,并将其放在其他路径之前。这样做可以让Windows优先找到imagemagic的convert程序,而不是其他的转换程序。例如:C:\Program Files\ImageMagick-6.9.2-Q16;C:\Program Files\Haskell Platform\2014.2.0.0\lib\extralibs\bin;...

  • 另一个选项是在机器上创建一个专门的文件夹,在其中放置一些名称冲突的快捷方式。然后,你需要将这些快捷方式重命名为有意义的名称,例如convert_image_magick,并将该文件夹的路径添加到系统路径中。这样,当你按下Tab键时,你将最终找到想要运行的正确程序。


1

是的!如果您启动管理员命令窗口,它默认为C:\ windows \ sytem32 \ ...只要您不在该目录中,命令就会捕捉到ImageMagick convert.exe

我的问题是我正在使用“FORFILES”命令,这很棘手,因为它需要使用“cmd / c”并传递带有@path和@file参数的转换命令,并对斜杠进行一些转义...不用说它已经让我头疼了数小时。它甚至解析十六进制字符,例如如果您的文件路径中有组合0x00,则它将认为那是一个十六进制值并搞乱您的路径。我有一个名为C:\ ImageRes3000x3000 的文件路径,而FORFILES会按字面意思解释它,这导致了奇怪的路径问题。如果这是一个冗长无用的帖子,我很抱歉,但它旨在提供FYI,如果有人遇到这个问题,也许它会对他们有所帮助。话虽如此,FORFILES和“convert.exe”是强大而简单的图像重命名行脚本组合。

这是我的完整三行图像重命名脚本

robocopy D:\SRC_DIR\ D:\DEST_DIR\_staging *.jpg /e /MAXAGE:2
FORFILES /P D:\DEST_DIR\_staging\ /S /M *.jpg /C "cmd /c convert.exe @path -quality 65 -resize 1500 D:\RESIZED_DIR\\@file"
DEL D:\DEST_DIR\_staging\*.* /S /Q

你的脚本路径是什么?Windows系统路径是什么?cmd /c将是C:\windows\sytem32路径吗?_ImageMagick_的安装路径在哪里?你是否有更多使用ImageMagick的脚本在同一路径下运行? - Kiquenet

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