我正在使用ImageMagick,我想知道从ImageMagick进程的StdOut中读取图像数据的最佳方法。

我是一个调用该过程的命令,如下所示: / opt / local / bin / convert -resize 8000 @ - -

然后将一个字节数组传递给进程进行处理。

从这样的流程中读取数据的最佳方法是什么?

有帮助吗?

解决方案

您可能需要查看 Apache Commons Exec 这为您提供了一个好方法运行可执行文件并将结果传递给Java。

它与使用迈克尔提到的方法类似,但应该允许您更多控制。

教程页面上有一些很好的使用示例。

其他提示

只想通过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存储在数组中的某些内容。并且在执行waitFor()之前启动线程,以防止,正如迈克尔所说,阻止。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top