我想获取包含任意文件(典型的“下载”目录)的目录的内容,并以编程方式确定给定文件是否为任何类型的图像。
我在Clojure工作,但JVM上可用的任何东西都是合理的游戏。
提前致谢!
答案 0 :(得分:2)
显然,最简单的方法是查看文件扩展名。当然,它不一定可靠,但在某些情况下可能就足够了。
如果没有读取整个图像,您可以读取文件的前几个字节,通过其“幻数”来识别它。例如,JPEG文件始终以两个字节0xFFD8开头,以0xFFD9结尾; PDF始终以字符串“%PDF”开头。
这样可以节省在内存中创建映像的开销,并且还可以加快I / O速度(因为您只需要文件的几个字节)。
如果您不想自己研究所有这些神奇的数字,可以尝试使用jMimeMagic这样的库。我从来没有使用它,所以我不能保证它的质量或完整性,但它是LGPL。我相信你也可以找到其他选择。
答案 1 :(得分:2)
您可以使用能够检测多种类型文件的Tika library,并从许多文件中提取元数据。我有一个非常简单的Clojure wrapper
答案 2 :(得分:2)
通过将您的问题评论与我之前的here答案相结合,我们能够解决这个问题。对代码进行微小更改后,可以使用非图像的图像。
我没有改变它以递归到子目录。很容易做到。
(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>
]