Come leggeresti i dati delle immagini da un programma come Image Magick in Java?

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

  •  05-07-2019
  •  | 
  •  

Domanda

Sto lavorando con ImageMagick e mi chiedo quale sia il modo migliore per leggere i dati delle immagini da StdOut del processo ImageMagick.

Ho invocato il comando nel processo in questo modo: / opt / local / bin / convert -resize 8000 @ - -

e quindi reindirizzare un array di byte al processo per l'elaborazione.

qual è il modo migliore per leggere i dati da un processo come questo?

È stato utile?

Soluzione

Potresti voler guardare Apache Commons Exec questo ti dà un buon modo di eseguire eseguibili e passare i risultati in Java.

È simile all'uso del metodo menzionato da Michael, tranne che dovrebbe permetterti un maggiore controllo.

Ci sono alcuni buoni esempi di utilizzo nella pagina tutorial .

Altri suggerimenti

Voglio solo pubblicare un esempio di codice usando ImageMagick tramite il comando exec di Apache per completezza

    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);
        }

    }

Il metodo Runtime.exec () restituisce un Process che ha metodi per ottenere flussi di input, output ed errori del processo richiamato.

Mi chiedo come sei riuscito a "reindirizzare un array di byte al processo" in qualsiasi altro modo.

Tieni presente che dovrai utilizzare più thread per gestire l'input e l'output del processo generato perché si bloccherà se provi a " pipe in " un sacco di input senza leggere alcun output.

Se si desidera utilizzare Runtime.exec (), consultare questa domanda come runtime.exec () può essere un po 'complicata.

Avrai voglia di cambiare StreamGobbler per OUTPUT in qualcosa che memorizza stdout in un array o qualcosa del genere. E avvia i thread prima di fare waitFor () per impedire, come ha detto Michael, il blocco.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top