0

jhead用来检查图像是否设置了方向标志,如果是,则旋转它并设置 exif 信息以指示它在查看时不需要旋转。在命令行上它看起来像:

jhead -autorot 'IMG_3680.JPG'

我试图用ProcessBuilder我的java应用程序在我正在查看的图像上调用它,但它用于jpegtran执行实际的图像旋转。这两个应用程序都可以从命令行正常工作,并且位于/opt/local/bin我的 Mac 上。

我不断得到:

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

4

1 回答 1

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:

  1. 转到运行 -> 运行配置 -> 环境
  2. 单击新建并为名称输入PATH和值输入/usr/bin:/bin:/usr/sbin:/sbin:/opt/local/bin/
  3. 单击应用。

如果您确实需要在 OS X 中设置它,那么似乎有几种方法(或者实际上是几个地方)。如果您需要它用于通过 Spotlight 启动的应用程序,请转到此处。如果您需要为终端设置 if 而不是去这里

于 2012-12-04T06:05:33.777 回答