2010-11-18 19 views
3

Je voudrais passer par un répertoire et choisir toutes les images et ensuite faire certaines choses en fonction de leurs dimensions. Quelles bibliothèques sont disponibles pour moi? Je travaille dans Clojure mais tout ce qui est disponible sur la JVM est un jeu équitable.Comment puis-je déterminer les dimensions d'un fichier image de format arbitraire (JPEG, PNG, etc.) sur la JVM?

Merci d'avance!

+0

La première personne à combiner les deux réponses ci-dessous est acceptée! ;) –

Répondre

7
(with-open [r (java.io.FileInputStream. "test.jpeg")] 
    (let [image (javax.imageio.ImageIO/read r)] 
    [(.getWidth image) (.getHeight image)])) 

Vous pouvez utiliser with-open avoir le flux automatiquement fermé.

Voici un exemple d'utilisation pour parcourir un certain nombre de fichiers dans un répertoire. Il suppose que tous les fichiers du répertoire sont des images. Le répertoire exemple contient uniquement votre avatar stackoverflow.

(defn files-in-dir [dir] 
    (filter #(not (.isDirectory %)) 
      (.listFiles (java.io.File. dir)))) 

(defn figure-out-height-width 
    [files] 
    (map (fn [file] 
     (with-open [r (java.io.FileInputStream. file)] 
      (let [img (javax.imageio.ImageIO/read r)] 
      [file (.getWidth img) (.getHeight img)]))) 
     files)) 

user>(figure-out-height-width (files-in-dir "/home/jmccrary/Downloads/pics/")) 
([#<File /home/jmccrary/Downloads/pics/test.jpeg> 32 32]) 
+0

Cela résout le problème de tas, mais ne répond pas entièrement à mon OP.^_^ –

+0

A édité le poste pour montrer plus. Renvoie une séquence de vecteurs que vous pourriez alimenter à autre chose. –

3

Le paquet javax.io est ce que vous cherchez.

(import 'java.io.File) 
(import 'java.io.FileInputStream) 
(import 'javax.imageio.ImageIO) 

(def img (ImageIO/read (FileInputStream. (File. "myfile.png")))) 

[ (.getWidth img) (.getHeight img)] 
  • Works pour les fichiers PNG et JPG.
  • Ceci a été affiché rapidement. Il y a plus de façons idiomatiques d'ouvrir un fichier et d'obtenir un InputStream dans Clojure.
+0

Merci. C'est exactement ce que je cherchais. Pourriez-vous fournir les moyens les plus idiomatiques pour accomplir cela? Je suis confronté à des problèmes de tas avec un petit nombre de fichiers, je suppose que parce que les flux ne sont pas fermés. –