4

我正在尝试比较位于我的操作系统机器下的两个图像。我在我的操作系统机器上运行了 ImageMagick。我正在使用这种方法:

public boolean compareImages (String expectedScreenShot, String capturedScreenShot, String pdiffCompare) {
  ProcessStarter.setGlobalSearchPath("/usr/local/bin/");
  CompareCmd compare = new CompareCmd();
  // For metric-output
  IMOperation cmpOp = new IMOperation();
  // Set the compare metric
  cmpOp.metric("AE");
  // Add the expected image
  cmpOp.addImage(expectedScreenShot);
  // Add the current image
  cmpOp.addImage(capturedScreenShot);
  // This stores the difference
  cmpOp.addImage(pdiffCompare);
  try {
     // Do the compare
     compare.run(cmpOp);
     compare.getErrorText();
     return true;
  }
  catch (Exception ex) {
     return false;
  }
   }

我正在使用 im4java:1.4.0,但是当我运行compare.run(cmpOp);时收到此异常:

org.im4java.core.CommandException:org.im4java.core.CommandException:magick:在 CLI arg 1 @error/operation.c/CLIOption/5225 处找不到操作“-metric”的图像。

任何帮助,将不胜感激。

4

2 回答 2

3

实际上这是评论而不是答案,但我不允许在这里发表评论。我是 im4java 的作者,但我的机器上目前没有安装 IM 7。如果可能的话,我会尝试升级并获得一些见解。

同时,您能否尝试转储生成的命令行(请参阅 im4java-docs)并直接尝试该命令行?请发布结果。

另一种解决方法是使用转换命令,例如 convert -verbose file1.jpg file2.jpg -metric ae -compare diff.jpg

这会创建差异文件,但我的安装不会将指标写入标准错误。这可能是您在使用 ErrorConsumer 时遇到的问题。在这种情况下,ImageMagick 必须修复他们的工具(magick 只是转换的新名称)。

另一种选择是切换到 GraphicsMagick。

于 2016-11-11T08:08:16.543 回答
2

我也在 linux 上看到了这个,但不是 windows,IMJava 版本 1.4 和 ImageMagick 7。

在挖掘和调试之后,我能够通过删除比较文件(指向魔法的符号链接)然后将魔法复制回比较(摆脱符号链接)来解决这个问题。

好奇的更多细节 - 当 im4java 准备运行 imagemagick 命令时,它会在命令上执行 File.getCanonicalName(在本例中为“compare”),并且该调用返回“magick”。因此,im4java 运行并使用比较期望的命令行参数调用 magick,并且您会收到 youssef 报告的异常。上述解决方法使 getCanonicalName 无法解析为“魔术”。

编辑以回答 Bernhard 的问题,因为我也无法评论:如果您运行它生成的命令行,您不会收到任何错误,因为命令行使用“比较”命令。API 中发生的事情是它使用了“magick”。例如“compare -metric AE foo.png bar.png diff.png”可以工作,但“magick -metric AE foo.png bar.png diff.png”不会。

于 2016-11-10T19:07:48.647 回答