ImageMagick/IM4J FileNotFoundException

3
我正在尝试使用IM4J(ImageMagick的Java包装器)创建JPEG缩略图,这是我第一次使用这两个库。请注意,这是由我的技术领导交给我的硬性要求(所以请不要建议使用除IM4J/ImageMagick之外的任何解决方案)- 在技术选择上我的手被绑住了!
我在convert命令中遇到FileNotFoundException,这告诉我我没有正确设置其中一个或两个库。
在我的电脑上,这是我的目录结构:
C:/
    myApp/
        images/             --> where all of my JPEGs are
        thumbnails/         --> where I want ImageMagick to send the converted thumbnails to
        imageMagickHome/    --> Where I downloaded the DLL to
            ImageMagick-6.7.6-1-Q16-windows-dll.exe
    ...
    

在我的Java项目中,我确保在运行时IM4J JAR(im4java-1.2.0.jar)在类路径上。虽然我需要使用1.2.0版本的IM4J,但我可以自由选择任何版本的ImageMagick。我选择这个版本只是因为它似乎是我Windows 7(32位)机器上最新/稳定的版本。如果我应该使用不同的版本,请在您的答案中向我发送来自ImageMagick下载页面的链接! 至于ImageMagick,我只是从这里下载了EXE,并将其放置在上面提到的文件夹中 - 我没有进行任何安装、向导、MSI、环境变量配置等操作。 然后,在我的Java代码中:
// In my driver...
File currentFile = new File("C:/myApp/images/test.jpg"); --> exists and is sitting at this location
File thumbFile = new File("C:/myApp/thumbnails/test-thumb.jpg"); --> doesnt exist yet! (destination file)
Thumbnailer myThumbnailer = new Thumbnailer();
myThumbnailer.generateThumbnail(currentFile, thumbFile);

// Then the Thumbnailer:
public class Thumbnailer
{
    // ... omitted for brevity
    
    public void generateThumbnail(File originalFile, File thumbnailFile)
    {
        // Reads appConfig.xml from classpath, validates it against a schema,
        // and reads the contents of an element called <imPath> into this
        // method's return value. See below
        String imPath = getIMPathFromAppConfigFile();
    
        org.im4java.core.IMOperation op = new Operation();
        op.colorspace(this.colorSpace);
        op.addImage(originalFile.getAbsolutePath());
        op.flatten();
        op.addImage(thumbnailFile.getAbsolutePath());
        
        ConvertCmd cmd = new ConvertCmd();
        
        cmd.setSearchPath(imPath);
        
        // This next line is what throws the FileNotFoundException
        cmd.run(op);
    }
}

我的 appConfig.xml 文件中包含 imPath 的部分:
<imPath>C:/myApp/imageMagickHome</imPath>

请注意-如果此appConfig.xml格式不正确,我们的模式验证器将捕获它。由于我们没有收到模式验证错误,因此我们可以排除这个问题。然而,请注意我的文件路径分隔符;它们都是正斜杠。我这样做是因为有人告诉我,在Windows系统中,正斜杠与*nix反斜杠一样处理文件路径。信不信由你,我们正在Windows机器上开发,但是部署到Linux服务器,所以这是我的解决方案(再次强调,不是我的决定!)。

IM4J甚至承认Windows用户有时会遇到麻烦,并在this文章中解释说,Windows开发人员可能需要设置IM4JAVA_TOOLPATH环境变量才能使该库正常工作。我尝试了这个建议,创建了一个同名的新的系统级环境变量,并将其值设置为C:\myApp\imageMagickHome。但是没有任何改变。但请注意,我在这里使用反斜杠。这是因为这个环境变量是本地机器上的,而appConfig.xml是一个配置描述符,部署到Linux服务器上。

据我所知,罪魁祸首可能是以下一个或多个:

  • 我没有正确“安装”ImageMagick EXE,应该使用安装程序/MSI;或者我需要添加一些其他的环境变量来支持ImageMagick(而不是IM4J)本身
  • 也许我仍然没有正确配置IM4J,需要添加更多的环境变量
  • 可能是来自我的appConfig.xml文件的Windows/*nix“/”与“”问题,如上所述
我也不知道为什么会在名为“convert”的文件上得到一个FileNotFoundException异常。我认为这是 IM4J jar 内的批处理/ shell 文件(因为我只下载了 ImageMagick 的 EXE)。但是,如果我提取 IM4J jar,我只能看到其中的类。我看到了“脚本生成器”类,所以我假设这些在我的 cmd.run(op) 调用之前启动,并创建 convert 文件,可能这就是我缺少的(也许我需要在执行我的 Thumbnailer 方法之前手动启动其中一个生成器,如 CmdScriptGenerator)。或者,也许我的下载是不完整的。无论哪种方式,我都不够熟悉这两个库,不知从何处开始。感谢任何对此的帮助。

@PinnyM - 我刚刚运行了安装程序,并将ImageMagick安装到C:/myApp/imageMagickHome目录下。现在我在我的文件系统中看到以下内容:C:/myApp/imageMagickHome/ImageMagick-6.7.6-Q16/。我重新运行了驱动程序,但仍然出现相同的错误。我需要更改环境变量或appConfig.xml设置以包含这个新的(自动安装的)目录吗? - IAmYourFaja
2个回答

1
首先运行“ImageMagick-6.7.6-1-Q16-windows-dll.exe”安装程序以安装imagemagick库。然后确保您的环境路径包括已安装二进制文件的位置(例如“convert.exe”,“mogrify.exe”等)。

如果您不介意的话,请查看我上面的评论,并让我知道这个答案是否解决了我现在遇到的第二个问题。非常感谢您迄今为止提供的所有帮助! - IAmYourFaja
如上所述,环境路径(最好是系统路径,但可选用户路径)需要包括ImageMagick二进制文件目录 - 对于您来说,应该是C:\ myApp \ imageMagickHome \ ImageMagick-6.7.6-Q16 - PinnyM
@srsajid,相同的想法应该适用,尽管文件和目录名称将反映您正在使用的ImageMagick版本。 - PinnyM

0

请确保您已经设置了环境变量IM4JAVA_TOOLPATH。

enter image description here


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