Comment liriez-vous des données d'image à partir d'un programme comme Image Magick In Java?

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

  •  05-07-2019
  •  | 
  •  

Question

Je travaille avec ImageMagick et je me demande quel est le meilleur moyen de lire des données d'image à partir de StdOut du processus ImageMagick.

J'appelle la commande au processus comme suit: / opt / local / bin / convert -resize 8000 @ - -

puis acheminer un tableau d'octets vers le processus à traiter.

quel est le meilleur moyen de lire les données d'un processus comme celui-ci?

Était-ce utile?

La solution

Vous pouvez consulter Apache Commons Exec pour vous donner une bonne idée. d'exécuter des exécutables et de passer les résultats en Java.

C’est similaire à l’utilisation de la méthode mentionnée par Michael, à ceci près que cela devrait vous permettre de contrôler davantage.

Il existe de bons exemples d'utilisation sur la page tutoriel .

Autres conseils

Je souhaite simplement publier un exemple de code à l'aide d'ImageMagick via un administrateur Apache commons afin de l'exhaustivité

    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);
        }

    }

La méthode Runtime.exec () renvoie un processus Process contenant des méthodes permettant d'obtenir les flux d'entrée, de sortie et d'erreur du processus appelé.

Je me demande comment vous avez réussi à "diriger un tableau d'octets vers le processus". de toute autre manière.

Notez que vous devrez utiliser plusieurs threads pour gérer les entrées et les sorties du processus généré, car celui-ci se bloquera si vous essayez de "transférer" " beaucoup d’entrée sans lire aucune sortie.

Si vous souhaitez utiliser Runtime.exec (), veuillez consulter cette question comme runtime.exec () peut être un peu délicat.

Vous voudrez changer StreamGobbler for OUTPUT en quelque chose qui stocke stdout dans un tableau ou autre. Et démarrez les threads avant de faire waitFor () pour empêcher, comme dit Michael, le blocage.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top