2016-10-30 6 views
2

내 OS 컴퓨터 아래에있는 두 개의 이미지를 비교하려고합니다. os 컴퓨터에서 ImageMagick이 실행 중입니다. 이 방법을 사용하여 및 메신저 :org.im4java.core.CommandException : magick : 작업을위한 이미지가 없습니다.

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에서`-metric '조작에 대한 이미지가 없습니다. @ 오류/operation.c/CLIOption/5225.

어떤 도움을 주시면 감사하겠습니다. 파고 및 디버깅 후 IMJava 버전 1.4 ImageMagick이 7

+0

'expectedScreenShot'과'capturedScreenShot'의 값은 무엇입니까? OS 머신이란 무엇입니까? –

+0

@Mark Setchell expectedScreenShot 및 capturedScreenShot은 내가 비교하고 싶은 이미지의 절대 경로입니다. 예, OS 시스템입니다. expectedScreenShot = /Users/username/src/automation/test2/test.png capturedScreenShot =/Users/username /src/automation/test3/test.png – Youssef

+0

'AE'를 원한다면'stderr'에 대해 compare.setErrorConsumer (StandardStream.STDERR);로 소비자를 설정할 필요가 있다고 생각합니다. –

답변

1

나는 또한 리눅스에이를보고 있지만 한 창, 내가 비교 파일 (마법 (magick)하는 심볼릭 링크)을 삭제하여이 문제를 해결 할 수 있었고, magick을 compare (symlink를 없애기 위해)로 복사하십시오.

im4java가 imagemagick 명령을 실행할 준비가되면 명령 (이 경우 'compare')에서 File.getCanonicalName을 수행하고 해당 호출이 'magick'으로 돌아옵니다. 그러면 im4java가 실행되고 magick이 expect 명령과 비교되는 명령 줄 매개 변수로 호출되며 youssef가보고 한 예외가 발생합니다. 위의 해결 방법은 getCanonicalName을 'magick'으로 해석하지 못하도록 트릭합니다.

Bernhard의 질문에 대한 답변도 나와 있습니다. 명령 줄에서 'compare'명령을 사용하기 때문에 명령 줄을 실행해도 오류가 발생하지 않습니다. API에서 일어나는 일은 대신 'magick'을 사용한다는 것입니다. 예를 들어 "compare -metric AE foo.png bar.png diff.png"는 작동하지만 "magick -metric AE foo.png bar.png diff.png"는 작동하지 않습니다.

+0

위의 대답은 우리에게 많은 도움이되었습니다. 보조 노트로서 - 기본적으로 심볼릭 링크 대신에'magick'에 대한 하드 링크를 만들 수 있습니다 :'ln magick compare' - 모두 (ident,'convert' 등)에 대해 그렇게하십시오. – Aramir

1

사실 이것은 답이 아닌 댓글이지만 여기서는 언급 할 수 없습니다. 필자는 im4java의 저자이지만 현재 IM 7이 내 컴퓨터에 설치되어 있지 않습니다. 가능하면 업그레이드하고 통찰력을 얻으려고 노력할 것입니다.

그동안 생성 된 명령 줄 (im4java-docs 참조)을 덤프하여 직접 명령 줄을 시도해 볼 수 있습니까? 결과를 게시하십시오.

다른 해결 방법은 변환 같이 변환-명령, 뭔가를 사용하는 것입니다 -verbose file1.jpg file2.jpg -metric AE -compare diff.jpg

이은 diff 파일을 생성하지만 내 설치가되지 않습니다 통계를 stderr에 씁니다. 이것은 ErrorConsumer에 대한 문제점 일 수 있습니다. 이 경우 ImageMagick은 도구를 수정해야합니다 (magick은 변환을위한 새로운 이름 임).

또 다른 옵션은 GraphicsMagick으로 전환하는 것입니다.

+0

힌트를 가져 주셔서 감사합니다. 내 작업 솔루션은 "convert"를 추가하는 것입니다 : op.addRawArgs ("convert"); 이것이 당신이 의도 한 해결책입니까? –