2016-10-30 27 views
2

OSマシンの下にある2つの画像を比較しようとしています。 私はImageMagickをosマシン上で実行しています。私はこの例外を受け取るcompare.run(cmpOp);イムを実行すると1.4.0:しかし、私はim4javaを使用してい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; 
    } 
    } 

org.im4java.core.CommandException:org.im4javaをこのメソッドを使用して とイム.core.CommandException: magick:CLIの引数1 @ error/operation.c/CLIOption/5225で、 `-metric '操作で画像が見つかりませんでした。

任意の助けいただければ幸いです。掘りとデバッグ後IMJavaバージョン1.4とImageMagickの7

+0

'expectedScreenShot'と' capturedScreenShot'の値は何ですか? OSマシンとは何ですか? –

+0

@マークSetchell expectedScreenShotとcapturedScreenShotは私がそれらの間で比較したい画像の絶対パスであり、はい、それはOSマシンexpectedScreenShot = /Users/username/src/automation/test2/test.png capturedScreenShot = /ユーザ/ユーザ名です/src/automation/test3/test.png – Youssef

+0

'AE'が必要な場合は、' compare.setErrorConsumer(StandardStream.STDERR);で 'stderr'のコンシューマを設定する必要があります。私がcompare.setErrorConsumer(StandardStream.STDERR)を使用したとき@マークSetchell; –

答えて

1

私もLinux上でこれを見たが、いなかった窓が、私はファイル比較(魔術のシンボリックリンク)を削除することによってこの問題を回避することができましたし、比較の上でmagickをコピーして戻します(シンボリックリンクを取り除くため)。

im4javaがimagemagickコマンドを実行する準備ができたら、コマンドのFile.getCanonicalName(この場合は 'compare')を実行し、その呼び出しに 'magick'が返されます。したがって、im4javaが実行され、magickが呼び出され、コマンドラインパラメータが期待値と比較され、youssef例外が報告されます。上記の回避策は、getCanonicalNameを 'magick'に解決しないようにトリックします。

編集私もコメントすることはできませんので、ベルンハルトの質問に答える:あなたはコマンドラインを実行する場合、それはあなたがエラーを取得していない生成するコマンドラインは、「比較」コマンドを使用しているため。 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' - それらのすべてに対して確実に行う( 'identify'、' convert'など) – Aramir

1

は、実はこれはコメントしていない答えですが、私はここにコメントすることはできませんよ。私はim4javaの作者ですが、現在私のマシンにIM 7はインストールされていません。可能であればアップグレードし、いくつかの洞察を得ようとします。一方

、あなたは生成されたコマンドラインをダンプしてみてください(im4java-ドキュメントを参照)、直接そのコマンドラインを試してみてくださいだろうか?結果を投稿してください。

別の回避策は、変換コマンドを使用することであろう、 変換のようなもの-verbose file1.jpg file2.jpg -metric AE -compare diff.jpg

これはdiffファイルを作成しますが、私のインストールはしていませんメトリックをstderrに書き込みます。これは、ErrorConsumerで問題が発生している可能性があります。この場合、ImageMagickはツールを修正する必要があります(magickは変換の新しい名前です)。

もう一つの選択肢は、GraphicsMagickに切り替えることです。

+0

ヒントをありがとう。私の実際の解決策は、 "convert"を追加することです:op.addRawArgs( "convert");これはあなたが意図した解決策ですか? –

関連する問題