Как бы вы считали данные изображения из такой программы, как Image Magick In Java?
-
05-07-2019 - |
Вопрос
Я работаю с ImageMagick и мне интересно, как лучше всего считывать данные изображений из StdOut процесса ImageMagick.
Я вызываю команду для процесса следующим образом: / opt / local / bin / convert -resize 8000 @ - -
и затем передать байтовый массив в процесс для обработки. Р>
Как лучше всего читать данные из такого процесса?
Решение
Возможно, вы захотите взглянуть на Apache Commons Exec . запуска исполняемых файлов и передачи результатов в Java. Р>
Это похоже на использование метода, упомянутого Майклом, за исключением того, что он позволит вам лучше контролировать. Р>
На учебном руководстве есть несколько хороших примеров использования.
Другие советы
Просто хочу опубликовать пример кода, используя ImageMagick, через Apache commons exec для полноты
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 () может быть немного сложнее. Р>
Вы захотите изменить StreamGobbler для OUTPUT на что-то, что хранит стандартный вывод в массиве или что-то подобное. И запустите потоки перед выполнением waitFor (), чтобы предотвратить, как сказал Майкл, блокировку.