我正在尝试使用IM4J(ImageMagick的Java包装器)创建JPEG缩略图,这是我第一次使用这两个库。请注意,这是由我的技术领导交给我的硬性要求(所以请不要建议使用除IM4J/ImageMagick之外的任何解决方案)- 在技术选择上我的手被绑住了!
我在
在我的电脑上,这是我的目录结构:
在我的Java项目中,我确保在运行时IM4J JAR(
我的 appConfig.xml 文件中包含 imPath 的部分:
请注意-如果此appConfig.xml格式不正确,我们的模式验证器将捕获它。由于我们没有收到模式验证错误,因此我们可以排除这个问题。然而,请注意我的文件路径分隔符;它们都是正斜杠。我这样做是因为有人告诉我,在Windows系统中,正斜杠与*nix反斜杠一样处理文件路径。信不信由你,我们正在Windows机器上开发,但是部署到Linux服务器,所以这是我的解决方案(再次强调,不是我的决定!)。
我在
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“/”与“”问题,如上所述
C:/myApp/imageMagickHome
目录下。现在我在我的文件系统中看到以下内容:C:/myApp/imageMagickHome/ImageMagick-6.7.6-Q16/
。我重新运行了驱动程序,但仍然出现相同的错误。我需要更改环境变量或appConfig.xml设置以包含这个新的(自动安装的)目录吗? - IAmYourFaja