2009-03-07 9 views
0

Je travaille avec ImageMagick et je me demande quelle est la meilleure façon de lire les données d'image à partir de StdOut du processus ImageMagick.Comment liriez-vous des données d'image depuis un programme comme Image Magick In Java?

Je l'appel de la commande au processus comme ceci: /opt/local/bin/convertir -resize 8000 @ - -

et la tuyauterie d'un tableau d'octets au processus de traitement. Quelle est la meilleure façon de lire les données d'un processus comme celui-ci?

Répondre

2

Vous voudrez peut-être regarder Apache Commons Exec cela vous donne un bon moyen d'exécuter des exécutables et de transmettre les résultats en Java.

Il est similaire à l'utilisation de la méthode de Michael mentionné, mais devrait vous permettre plus de contrôle.

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

+0

Merci, mes problèmes étaient la plupart du temps entre la chaise et le clavier et en raison du piratage trop tard dans la nuit. Cependant, votre conseil pour Apache Exec a porté ses fruits et a amélioré la qualité de la solution. –

1

La méthode Runtime.exec() renvoie un Process qui contient 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 à "canaliser un tableau d'octets vers le processus" de toute autre manière. Notez que vous devrez utiliser plusieurs threads pour gérer l'entrée et la sortie du processus engendré, car il bloquera si vous essayez d'insérer beaucoup d'entrées sans lire aucune sortie.

1

Si vous souhaitez utiliser Runtime.exec(), veuillez consulter this question car runtime.exec() peut être un peu compliqué.

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

2

Je veux juste faire un exemple de code utilisant ImageMagick via Apache Commons exec pour être complet

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

    } 
Questions connexes