【问题标题】:How can I determine the dimensions of an image file of arbitrary format (JPEG, PNG, etc.) on the JVM?如何确定 JVM 上任意格式(JPEG、PNG 等)的图像文件的尺寸?
【发布时间】:2010-11-18 17:48:23
【问题描述】:

我想浏览一个目录并挑选出所有图像,然后根据它们的尺寸做一些事情。我可以使用哪些库来执行此操作?

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

提前致谢!

【问题讨论】:

  • 第一个结合以下两个答案的人将被接受! ;)

标签: image clojure jvm


【解决方案1】:
(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])

【讨论】:

  • 这解决了堆问题,但没有完全回答我的 OP。 ^_^
  • 编辑了帖子以显示更多内容。返回一个向量序列,您可以将其提供给其他东西。
【解决方案2】:

包裹javax.io 就是您要找的。​​p>

(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 有更多惯用的方法。

【讨论】:

  • 谢谢。这正是我一直在寻找的。你能提供更惯用的方法来实现这一点吗?我遇到了少量文件的堆问题,我怀疑是因为流没有关闭。
【解决方案3】:

也许更有效的答案可能是

(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])))

这不需要将整个图像读入内存。

改编自https://stackoverflow.com/a/1560052

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-12
  • 2012-11-05
  • 2016-06-30
  • 1970-01-01
  • 1970-01-01
  • 2012-06-17
  • 2014-08-06
相关资源
最近更新 更多