Pregunta

Estoy trabajando con ImageMagick y me pregunto cuál es la mejor manera de leer los datos de imagen desde StdOut del proceso ImageMagick.

Yo invoco el comando al proceso así: / opt / local / bin / convert -resize 8000 @ - -

y luego canalizando una matriz de bytes al proceso para su procesamiento.

¿Cuál es la mejor manera de leer datos de un proceso como este?

¿Fue útil?

Solución

Es posible que desee consultar Exec. de Apache Commons que le ofrece una buena manera de ejecutar ejecutables y pasar los resultados a Java.

Es similar a usar el método que Michael mencionó, excepto que debería permitirte un mayor control.

Hay algunos buenos ejemplos de uso en la página tutorial .

Otros consejos

Solo quiero publicar una muestra de código usando ImageMagick a través de Apache commons exec para completarla

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

    }

El método Runtime.exec () devuelve un Process que tiene métodos para obtener los flujos de entrada, salida y error del proceso invocado.

Me pregunto cómo lograste " canalizar una matriz de bytes al proceso " de cualquier otra manera.

Tenga en cuenta que tendrá que usar varios subprocesos para manejar la entrada y la salida del proceso generado porque se bloqueará si intenta " canalizar en " mucha entrada sin leer ninguna salida.

Si desea utilizar Runtime.exec (), revise esta pregunta como runtime.exec () puede ser un poco difícil.

Querrá cambiar el StreamGobbler para OUTPUT en algo que almacene stdout en una matriz o algo así. Y comienza los hilos antes de hacer waitFor () para evitar, como dijo Michael, bloquear.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top