org.im4java.core.CommandException:magick:找不到操作的图像

时间:2016-10-30 11:58:27

标签: java selenium imagemagick im4java

我正在尝试比较位于我的操作系统机器下的两个图像。 我在我的os机器上运行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:没有找到操作图像`-metric'在CLI arg 1 @   误差/ operation.c / CLIOption / 5225。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

我也在Linux上看到了这个,但没有Windows,IMJava 1.4和ImageMagick 7。

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

好奇的更多细节 - 当im4java准备好运行imagemagick命令时,它会在命令上执行File.getCanonicalName(在这种情况下'比较')并且该调用以&#返回39; magick&#39 ;.因此,im4java运行并使用比较期望的命令行参数调用magick,并且您将获得您报告的异常。上面的解决方法欺骗了getCanonicalName,而不是解析为' magick'。

编辑以回答Bernhard的问题,因为我也无法评论:如果您运行命令行,它会生成您没有错误,因为命令行使用'比较'命令。 API中发生的事情是它正在使用&mag;'代替。例如"比较-metric AE foo.png bar.png diff.png"但是" magick -metric AE foo.png bar.png diff.png"不会。

答案 1 :(得分:1)

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

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

另一种解决方法是使用convert-command,类似于 convert -verbose file1.jpg file2.jpg -metric ae -compare diff.jpg

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

另一种选择是切换到GraphicsMagick。