2009-03-07 6 views
0

私はImageMagickを使用していますが、ImageMagickプロセスのStdOutから画像データを読み込むにはどうすればよいのでしょうか。Image Magickのようなプログラムから画像データをどのように読み込みますか?

私はそうのようなプロセスにコマンドを呼び出す: は/ opt/local/binに/ @ -resize 8000に変換 - -

をして処理する方法にバイト配列をパイプします。

このようなプロセスからデータを読み取る最良の方法は何ですか?

答えて

2

Apache Commons Execを参照すると、実行可能ファイルを実行して結果をJavaに渡すのに適しています。

これは、マイケル氏が述べた方法を使用するのと似ていますが、あなたにはより多くのコントロールが必要です。

tutorialページにはいくつかの良い使用例があります。

+0

のためのApache Commonsの幹部経由のImageMagickを使用してのサンプルコードを投稿したいのおかげで、私の問題は、あまりにも夜遅く、主に椅子とキーボードの間や原因の道をハッキングしました。しかし、Apache Execのヒントはうまくいっていて、ソリューションの品質を向上させました。 –

1

Runtime.exec()メソッドは、呼び出されたプロセスの入力、出力、およびエラーストリームを取得するメソッドを持つProcessを返します。

他の方法で「バイト配列をプロセスにパイプ」する方法はどうでしたか?

出力を読み取らずにたくさんの入力を「パイプイン」しようとするとブロックされるため、生成されたプロセスの入力と出力を処理するために複数のスレッドを使用する必要があることに注意してください。

1

Runtime.exec()を使用する場合は、this questionを確認してください。runtime.exec()はちょっと難しいかもしれません。

OUTPUTのStreamGobblerを、stdoutを配列などに格納するものに変更する必要があります。そして、マイケルが言ったように、waitFor()を実行する前にスレッドを開始してブロックします。

2

ちょうど完全

try { 

     StringBuffer sb = new StringBuffer(); 
     sb.append(this.validPathToImageMagickCommand); 
     sb.append('\u0020'); 
     for (int i = 0; i < args.size(); i++) { 
      String s = args.get(i); 
      sb.append(s); 
     } 


     CommandLine cl = CommandLine.parse(sb.toString()); 

     PumpStreamHandler pumpStreamHandler = new PumpStreamHandler(output, System.err, new ByteArrayInputStream(inputBytes)); 
     byAs = new ByteArrayInputStream(inputBytes); 
     pumpStreamHandler.setProcessOutputStream(byAs); 

     DefaultExecutor executor = new DefaultExecutor(); 
     executor.setStreamHandler(pumpStreamHandler); 
     int exitValue = executor.execute(cl); 

     outputBytes = output.toByteArray(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      if (byAs != null) 
       byAs.close(); 

      if (output != null) 
       output.close(); 

     } catch (IOException e) { 
      System.out.println(e); 
     } 

    } 
関連する問題