我想通过一个目录并挑选出所有图像,然后根据它们的尺寸做一些事情。我可以使用哪些库来执行此操作?
我在Clojure工作,但JVM上可用的任何东西都是合理的游戏。
提前致谢!
答案 0 :(得分:8)
(with-open [r (java.io.FileInputStream. "test.jpeg")]
(let [image (javax.imageio.ImageIO/read r)]
[(.getWidth image) (.getHeight image)]))
您可以使用with-open
自动关闭流。
以下是使用迭代目录中的一些文件的示例。它假定目录中的所有文件都是图像。示例目录仅包含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])
答案 1 :(得分: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)]
答案 2 :(得分:0)
也许更有效的答案是
(ns common.image
(:require [clojure.java.io :as io])
(:import (javax.imageio ImageIO)))
(defn dimensions [src]
(let [res (if (string? src) (io/file (io/resource src)) src)]
(if res
(let [image-input-stream (ImageIO/createImageInputStream res)
readers (ImageIO/getImageReaders image-input-stream)]
(if-let [r (and (.hasNext readers) (.next readers))]
(try
(.setInput r image-input-stream)
[(.getWidth r 0) (.getHeight r 0)]
(finally
(.dispose r)))))
[0 0])))
这不需要将整个图像读入内存。