Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image 如何确定文件是否是JVM上的映像?_Image_Clojure_Jvm - Fatal编程技术网

Image 如何确定文件是否是JVM上的映像?

Image 如何确定文件是否是JVM上的映像?,image,clojure,jvm,Image,Clojure,Jvm,我希望获得包含任意文件的目录(典型的“下载”目录)的内容,并通过编程确定给定文件是否为任何类型的映像 我在Clojure工作,但是JVM上可用的任何东西都是公平的 提前谢谢 显然,最简单的方法是查看文件扩展名。当然,它不一定可靠,但在某些情况下可能就足够了 除了读取整个图像,您还可以读取文件的前几个字节,通过其“幻数”来识别它。例如,JPEG文件总是以两个字节0xFFD8开头,以0xFFD9结尾;PDF始终以字符串“%PDF”开头 这样可以节省在内存中创建映像的开销,还可以加快I/O速度(因为您

我希望获得包含任意文件的目录(典型的“下载”目录)的内容,并通过编程确定给定文件是否为任何类型的映像

我在Clojure工作,但是JVM上可用的任何东西都是公平的


提前谢谢

显然,最简单的方法是查看文件扩展名。当然,它不一定可靠,但在某些情况下可能就足够了

除了读取整个图像,您还可以读取文件的前几个字节,通过其“幻数”来识别它。例如,JPEG文件总是以两个字节0xFFD8开头,以0xFFD9结尾;PDF始终以字符串“%PDF”开头

这样可以节省在内存中创建映像的开销,还可以加快I/O速度(因为您只需要几个字节的文件)


如果你不想自己研究所有这些神奇的数字,你可以尝试一个库,比如。我从未使用过它,所以我不能保证它的质量或完整性,但它是LGPL。我相信您也可以找到其他替代方案。

您可以使用能够检测多种类型的文件,并从其中提取元数据的。我的答案很简单

通过将对你问题的评论与我之前的回答结合起来,最终解决了这个问题。对代码的微小更改允许它处理非图像的图像

我没有将其更改为递归到子目录。这很容易做到

(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文件[dir]
(筛选器#(不是(.isDirectory%))
(.listFiles(java.io.File.dir)))
(defn计算出高度和宽度
[档案]
(删除零?
(地图(fn[文件]
(打开[r(java.io.FileInputStream.file)]
(如果让[img(javax.imageio.imageio/read r)]
[文件(.getWidth img)(.getHeight img)])
(文件)
用户>(pprint(目录中的文件“/home/jmcrary/Downloads/”)
(#                                                                 
#                                                                           
#                                                                                           
#                                                                                            
#                                                                     
#                                                                                   
#                                                                          
#                                                                         
#)                                                                              
无
用户>(计算高度和宽度(目录中的文件“/home/jmcrary/Downloads”))
([# 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>
(defn过滤器图像
[档案]
(减少(fn[res文件]
(如果let[img(javax.imageio.imageio/read file)]
(联合王国)
(res))
[]                                                                                                                           
(文件)
用户>(筛选图像(dir/home/jmcrary/Downloads中的文件)
[#

]

这里有一个有用的链接:tika library有更合适的许可证;-)我不想说什么许可证最适合其他人的项目,但tika看起来像一个健壮且开发良好的库。感谢您的建议。这很简单,只需使用(使用'tika)(检测mime类型文件),但您可以使用字符串、url或InputStream来代替文件