你会如何从像Image Magick In Java这样的程序中读取图像数据?
-
05-07-2019 - |
题
我正在使用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()之前启动线程,以防止,正如迈克尔所说,阻止。
不隶属于 StackOverflow