Como você lê dados de imagem a partir de um programa como Imagem Magick em Java?
-
05-07-2019 - |
Pergunta
Eu estou trabalhando com ImageMagick e estou querendo saber qual é a melhor maneira de ler dados de imagem a partir StdOut do processo ImageMagick.
Eu um invocando o comando para o processo assim: / Opt / local / bin / converso resize 8000 @ - -
e, em seguida, canalizando uma matriz de bytes para o processo de processamento.
qual é a melhor maneira de ler dados a partir de um processo como este?
Solução
Você pode querer olhar em Apache Commons Exec isso lhe dá uma boa maneira de execução de executáveis ??e passando os resultados em Java.
É semelhante a usar o método de Michael mencionado exceto deverá permitir-lhe mais controle.
Há alguns bons exemplos de uso na tutorial página.
Outras dicas
Apenas quero postar um exemplo de código usando ImageMagick via commons Apache exec para a integralidade
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);
}
}
O método Runtime.exec()
retorna um Process
que tem métodos para obter a entrada, saída e erro córregos do processo de chamada.
Eu me pergunto como você conseguiu "pipe uma matriz de bytes para o processo" de qualquer outra forma.
Note que você terá que usar vários segmentos para lidar com a entrada e a saída do processo gerado porque vai bloquear se você tentar "pipe em" um monte de entrada sem ler qualquer saída.
Se você quiser usar Runtime.exec (), consulte esta questão como Runtime.exec () pode ser um pouco complicado.
Você vai estar querendo mudar o StreamGobbler para saída em algo que as lojas stdout em uma matriz ou algo assim. E iniciar os tópicos antes de fazer waitFor () para impedir, como Michael disse, bloqueando.