你会如何从像Image Magick In Java这样的程序中读取图像数据?

时间:2009-03-07 09:40:55

标签: java image-processing

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

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

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

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

4 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:2)

只想通过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);
        }

    }

答案 2 :(得分:1)

Runtime.exec()方法返回Process,其中包含获取被调用进程的输入,输出和错误流的方法。

我确实想知道你是如何设法“以任何其他方式将字节数组传递给进程”。

请注意,您必须使用多个线程来处理生成进程的输入和输出,因为如果您尝试“输入”大量输入而不读取任何输出,它将会阻塞。

答案 3 :(得分:1)

如果您确实想使用Runtime.exec(),请查看this question,因为runtime.exec()可能有点棘手。

您可能希望将OUTPUT的StreamGobbler更改为将stdout存储在数组中的某些内容。并且在执行waitFor()之前启动线程,以防止,正如迈克尔所说,阻止。