Как бы вы считали данные изображения из такой программы, как Image Magick In Java?

StackOverflow https://stackoverflow.com/questions/621596

  •  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 (), чтобы предотвратить, как сказал Майкл, блокировку.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top