我正在使用jhead
检查图像是否设置了Orientation标志,如果是,则旋转它并设置exif信息以指示在查看时不需要旋转它。它在命令行上看起来像:
jhead -autorot 'IMG_3680.JPG'
我正在尝试使用ProcessBuilder
从我正在查看的图片上的java应用程序中调用它,但它使用jpegtran
来进行实际的图像旋转。这两个应用程序都可以从命令行正常运行,并且位于我的Mac上的/opt/local/bin
。
我一直在:
sh: jpegtran: command not found
Error : Problem executing specified command
in file '/images/IMG_3681.JPG'
我的代码是:
public static void main(String[] args) throws Exception {
File[] files = (new File("/images")).listFiles();
for (File file : files){
ProcessBuilder pb = new ProcessBuilder("jhead", "-autorot", file.getAbsolutePath());
pb.redirectOutput(Redirect.INHERIT);
pb.redirectError(Redirect.INHERIT);
Process p = pb.start();
}
}
我是否需要向ProcessBuilder
提供提示,以便jhead
能够致电jpegtran
?
答案 0 :(得分:0)
经过一些猜测后,我确定PATH
环境变量未正确设置。它有/usr/bin:/bin:/usr/sbin
,显然不包括/opt/local/bin
。我这样添加了它:
Map<String, String> env = pb.environment();
env.put("PATH", env.get("PATH")+":/opt/local/bin/");
现在可以产生正确的结果。但真正的解决方案是将/opt/local/bin/
添加到PATH
环境变量中,而不是直接在代码中添加它。
<小时/> 更新:经过一番观察,如果我从终端而不是Eclipse运行我的应用程序,这似乎不会有问题。在终端中正确设置了
PATH
变量,但我不得不将其添加到Eclipse中。要将它添加到Eclipse: