Como você lê dados de imagem a partir de um programa como Imagem Magick em Java?

StackOverflow https://stackoverflow.com/questions/621596

  •  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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top