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

Я работаю с ImageMagick и мне интересно, как лучше всего считывать данные изображений из StdOut процесса ImageMagick.

Я вызываю команду для процесса следующим образом: / opt / local / bin / convert -resize 8000 @ - -

и затем передать байтовый массив в процесс для обработки.

Как лучше всего читать данные из такого процесса?

Ответы [ 4 ]

2 голосов
/ 09 марта 2009

Просто хочу опубликовать пример кода с помощью 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);
        }

    }
2 голосов
/ 07 марта 2009

Возможно, вы захотите взглянуть на Apache Commons Exec , это дает вам хороший способ запуска исполняемых файлов и передачи результатов в Java.

Это похоже на использование метода, упомянутого Майклом, за исключением того, что он позволит вам лучше контролировать.

На странице есть несколько хороших примеров использования.

1 голос
/ 07 марта 2009

Если вы хотите использовать Runtime.exec (), просмотрите этот вопрос , так как runtime.exec () может быть немного сложнее.

Вы захотите заменить StreamGobbler для OUTPUT на что-то, что хранит стандартный вывод в массиве или что-то подобное. И запустите потоки перед выполнением waitFor (), чтобы предотвратить, как сказал Майкл, блокировку.

1 голос
/ 07 марта 2009

Метод Runtime.exec() возвращает Process, в котором есть методы для получения входных, выходных и ошибочных потоков вызванного процесса.

Мне интересно, как вам удалось каким-либо другим способом "передать байтовый массив в процесс".

Обратите внимание, что вам придется использовать несколько потоков для обработки ввода и вывода порожденного процесса, потому что он будет блокироваться, если вы попытаетесь "передать" много ввода без чтения какого-либо вывода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...