Image Magick In Javaのようなプログラムからどのように画像データを読み込みますか?
-
05-07-2019 - |
質問
ImageMagickを使用していますが、ImageMagickプロセスのStdOutから画像データを読み込む最良の方法は何ですか?
次のようにプロセスにコマンドを呼び出します: / opt / local / bin / convert -resize 8000 @--
次に、処理のためにバイト配列をプロセスにパイプします。
このようなプロセスからデータを読み取る最良の方法は何ですか?
解決
Apache Commons Exec をご覧になるとよい方法です。実行可能ファイルの実行と結果のJavaへの引き渡し。
これは、Michaelが言及した方法を使用するのと似ていますが、より詳細に制御できる必要があります。
チュートリアルページに使用例がいくつかあります。
>他のヒント
完全を期すため、Apache commons exec経由でImageMagickを使用してコードサンプルを投稿したいだけです
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);
}
}
Runtime.exec()
メソッドは、呼び出されたプロセスの入力、出力、およびエラーストリームを取得するためのメソッドを持つ Process
を返します。
どのようにして「バイト配列をプロセスにパイプする」ことができたのでしょうか。他の方法で。
「パイプイン」しようとするとブロックされるため、生成されたプロセスの入力と出力を処理するために複数のスレッドを使用する必要があることに注意してください。出力を読み込まずに多くの入力を行います。
Runtime.exec()を使用する場合は、 runtime.exec()としてのこの質問は少し注意が必要です。
OUTPUTのStreamGobblerを、stdoutを配列などに保存するものに変更する必要があります。 Michaelが言ったように、ブロッキングを防ぐためにwaitFor()を実行する前にスレッドを開始します。