Закончилась возможность решить эту проблему, объединив комментарий к вашему вопросу вместе с моим более ранним ответом от здесь . Незначительные изменения в коде позволяют работать с изображениями, которые не являются изображениями.
Я не изменил его, чтобы переходить в подкаталоги. Было бы достаточно легко сделать.
(defn files-in-dir [dir]
(filter #(not (.isDirectory %))
(.listFiles (java.io.File. dir))))
(defn figure-out-height-width
[files]
(remove nil?
(map (fn [file]
(with-open [r (java.io.FileInputStream. file)]
(if-let [img (javax.imageio.ImageIO/read r)]
[file (.getWidth img) (.getHeight img)])))
files)))
user> (pprint (files-in-dir "/home/jmccrary/Downloads/"))
(#<File /home/jmccrary/Downloads/Girl_Talk_-_All_Day_(IA123)_mp3s.zip>
#<File /home/jmccrary/Downloads/CSS3-for-Web-Designers.zip>
#<File /home/jmccrary/Downloads/manual.pdf>
#<File /home/jmccrary/Downloads/test.jpeg>
#<File /home/jmccrary/Downloads/nautilus-dropbox_0.6.7_amd64.deb>
#<File /home/jmccrary/Downloads/rubygems-1.3.7.tgz>
#<File /home/jmccrary/Downloads/HTML5-FOR-WEB-DESIGNERS.zip>
#<File /home/jmccrary/Downloads/bcompare-3.1.11.12238.tar.gz>
#<File /home/jmccrary/Downloads/shared_ptr_example.cpp>)
nil
user> (figure-out-height-width (files-in-dir "/home/jmccrary/Downloads"))
([#<File /home/jmccrary/Downloads/test.jpeg> 32 32])
Подумав немного, кажется грязным объединять проверку на наличие файла, представляющего собой изображение, с вытягиванием ширины и высоты. В качестве альтернативы вы можете определить функцию, которая выполняет эту фильтрацию отдельно и выдает последовательность изображений.
(defn filter-images
[files]
(reduce (fn [res file]
(if-let [img (javax.imageio.ImageIO/read file)]
(conj res img)
res))
[]
files))
user> (filter-images (files-in-dir "/home/jmccrary/Downloads"))
[#<BufferedImage BufferedImage@24753433: type = 5 ColorModel: #pixelBits = 24 numComponents = 3 color space = java.awt.color.ICC_Color\
Space@43036651 transparency = 1 has alpha = false isAlphaPre = false ByteInterleavedRaster: width = 32 height = 32 #numDataElements 3 \
dataOff[0] = 2>
]