我正在尝试使用IM4J(imagemagick的java包装)来创建jpeg的缩略图,这是我第一次使用这两个库。请注意,这是我的技术主管交给我的一个硬性要求(所以请不要建议使用除IM4J/ImageMagick以外的任何其他解决方案)-我的手绑在这里的技术选择!
我在andFileNotFoundException
命令上得到一个convert
命令,它告诉我这些库中没有一个(或两个库)设置正确。
在我的计算机上,以下是我的目录结构:
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版本。我之所以选择这个版本,是因为它看起来是我的Windows7(32位)计算机最新/最稳定的版本。如果我应该使用不同的版本,请在您的答案中从ImageMagick下载页面向我发送一个链接!至于imagemagick,我只是从here下载了那个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
env var才能使这个库工作。我尝试了这个建议,创建了一个同名的新系统范围环境变量,并将其值设置为C:\myApp\imageMagickHome
。仍然没有区别。但注意这里我用的是反斜杠。这是因为这个env var是我的机器本地的,而appconfig.xml是部署到Linux服务器的配置描述符。据我所知,罪魁祸首可能是以下一种(或多种):
我没有正确“安装”imagemagick exe,应该使用安装程序/msi;或者我需要为imagemagick(不是im4j)本身添加一些其他环境变量
也许我仍然没有正确配置im4j,需要添加更多的环境变量
可能是上面提到的我的appconfig.xml文件中的windows/*nix“/”vs.“\”问题
我也很困惑为什么我在一个名为“convert”的文件上得到一个
FileNotFoundException
:java.io.fileNotFoundException:转换
我假设这是一个批处理/shell文件,位于im4j jar中的某个地方(因为我为imagemagick下载的唯一文件是exe)。但是,如果我提取im4j jar,我只能看到其中的类。我看到“script generator”类,所以我假设这些类在我的
cmd.run(op)
调用和创建convert
文件之前启动,也许这就是我缺少的(也许我需要在执行CmdScriptGenerator
方法之前手动启动其中一个生成器,比如Thumbnailer
。。或者,可能我的下载不完整。不管怎样,我对任何一个图书馆都不够精通,不知道从哪里开始。
谢谢你的帮助。
最佳答案
首先运行“imagemagick-6.7.6-1-q16-windows-dll.exe”安装程序以安装imagemagick库。然后确保您的环境路径包含已安装二进制文件的位置(“convert.exe”、“mogrify.exe”等)