我试图比较两个图像位于我的操作系统下的机器。我的操作系统上运行着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 1@error/Oper.c/CLIOption/5225上找到操作‘-米制’的图像。
任何帮助都将不胜感激。
发布于 2016-11-11 08:08:16
实际上,这是一个评论,而不是回答,但我不能在这里发表评论。我是im4java的作者,但我目前还没有在我的机器上安装IM 7。如果可能的话,我会尝试升级并获得一些洞察力。
同时,您能否尝试转储生成的命令行(请参阅im4java-docs)并直接尝试该命令行?请张贴结果。
另一个解决方法是使用转换命令,类似于-verbose file1.jpg file2.jpg -metric ae -compare diff.jpg
这将创建diff文件,但我的安装并没有将度量标准写入stderr。这可能是ErrorConsumer的问题所在。在这种情况下,ImageMagick必须修复它们的工具(magick只是一个转换的新名称)。
另一种选择是切换到GraphicsMagick。
发布于 2016-11-10 19:07:48
我在linux上也看到了这种情况,但没有看到IMJava版本1.4和ImageMagick 7的windows。
在挖掘和调试之后,我能够通过删除比较文件(一个指向magick的符号链接)来解决这个问题,然后将Magickover比较法复制回来(以摆脱符号链接)。
对于好奇的人来说,还有更多的细节--当im4java准备运行imagemagick命令时,它对命令执行一个File.getCanonicalName (在本例中是'compare'),这个调用将返回'magick‘。因此,im4java运行并使用命令行参数调用magick,该命令行参数比较expects,您将得到youssef报告的异常。上述解决办法使getCanonicalName无法解决“魔术”问题。
编辑以回答Bernhard的问题,因为我也不能评论:如果运行命令行,它会生成错误,因为命令行使用的是“比较”命令。API中所发生的事情是,它使用的是“magick”。例如,“比较-metric AE foo.png bar.png diff.png”有效,但"magick -metric AE foo.png bar.png diff.png“则不会。
发布于 2022-04-09 12:08:59
我今天和ImageMagick7和im4java遇到了同样的问题。这就是我的答案:使用自定义命令代替这些准备好的命令,比如ImageCommand imageCommand = new ImageCommand("magick","compare");而不是CompareCmd compare = new CompareCmd();,因为IM7在IM6命令之前添加了前缀“magick”。
https://stackoverflow.com/questions/40328791
复制相似问题