2010-11-18 24 views
3

私はディレクトリを通ってすべての画像を選び、その次元に基づいていくつかのことをしたいと思います。これを行うために私に利用できるライブラリは何ですか?JVM上の任意の形式(JPEG、PNGなど)の画像ファイルのサイズを確認するにはどうすればよいですか?

私はClojureで作業していますが、JVMで利用できるものはすべて公正なゲームです。

ありがとうございます!

+0

以下の2つの回答を最初に組み合わせた人が受け入れられます。 ;) –

答えて

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

あなたはストリームが自動的に閉じ持ってwith-openを使用することができます。

ここでは、ディレクトリ内のいくつかのファイルを繰り返し処理する例を示します。ディレクトリ内のすべてのファイルがイメージであると仮定します。サンプルディレクトリには、あなたのスタックオーバーフローアバターだけが含まれています。

(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

それはヒープの問題を解決しますが、私のOPに完全には答えません。^_^ –

+0

投稿を編集してさらに表示しました。あなたが何かに与えることができるベクトルのシーケンスを返します。 –

3

パッケージjavax.ioはあなたが探しているものです。

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

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

[ (.getWidth img) (.getHeight img)] 
  • PNGとJPGファイルの両方のための作品。
  • これは急いで掲載されました。ファイルを開いてClojureでInputStreamを取得する方法は、もっと慣れています。
+0

ありがとうございます。それはまさに私が探していたものです。これを達成するためのより慣用的な方法を提供できますか?非常に少数のファイルでヒープの問題が発生していますが、ストリームが閉じられていないと思われます。 –

関連する問題