Как определить размеры файла изображения произвольного формата (JPEG, PNG и т. Д.) На JVM? - PullRequest
3 голосов
/ 18 ноября 2010

Я хотел бы просмотреть каталог, выбрать все изображения, а затем сделать некоторые вещи, основываясь на их размерах.Какие библиотеки доступны для меня?

Я работаю в Clojure, но все, что доступно на JVM, является честной игрой.

Заранее спасибо!

Ответы [ 3 ]

8 голосов
/ 18 ноября 2010
(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])
3 голосов
/ 18 ноября 2010

Пакет 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)]
  • Работает как для файлов png, так и для jpg.
  • Это сообщение опубликованов спешке, спешу.Есть более идиоматические способы открыть файл и получить InputStream в Clojure.
0 голосов
/ 27 июня 2019

Возможно, более эффективным ответом может быть

(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

...