我正在尝试比较位于我的操作系统机器下的两个图像。 我在我的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。
任何帮助都将不胜感激。
答案 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。