3

我是一个clojure 新手(而且我不知道任何Java 可言)。

我的目标是从 URL 中获取图像并制作缩略图。到目前为止我有这个:

(ns myapp.image
  (:require [clojure.java.io :as io])
  (:import  [javax.imageio.ImageIO]
            [java.awt.image.BufferedImage]))

(defn get-remote-image
  [url file]
  (with-open [in (io/input-stream url) out (io/output-stream file)]
    (io/copy in out)))

(defn resize
  "Resize a file.  Pass in a width and height."
  [file-in file-out width height]
  (let [img     (javax.imageio.ImageIO/read (io/file file-in))
        imgtype (java.awt.image.BufferedImage/TYPE_INT_ARGB)
        simg    (java.awt.image.BufferedImage. width height imgtype)
        g       (.createGraphics simg)]
    (.drawImage g img 0 0 width height nil)
    (.dispose g)
    (javax.imageio.ImageIO/write simg "png" (io/file file-out))))

现在它从 url 中获取图像并将其写入磁盘,缓冲区到缓冲区。然后它从磁盘读取并调整内存中的图像大小,再次将其写入新文件。最后,我可以删除第一个副本。

我想一次性完成整个操作,而不需要临时磁盘写入。我并不特别介意将整个图像保存在内存中……就我的目的而言,它们通常是较小的图像。

我不明白如何将数据从 io 流传递给java.awt.image.BufferedImage对象。

4

2 回答 2

6

我刚刚创建了一个新的 libray Imagez,您可能会发现它很有用:它有一个scale-image功能,在缩放图像方面应该完全符合您的要求:

(use 'mikera.image.core)

;; scale an image into a thumbnail of a given size
(def thumbnail (scale-image some-buffered-image new-width new-height))

将图像处理操作与 IO 函数分开可能是一个好主意,这样您就可以在需要时在内存中完成所有操作而无需文件系统依赖项(例如,用于测试)。

于 2013-05-15T09:09:53.103 回答
2

使用以 a作为参数的read方法并返回对象。ImageIOURLBufferedImage

于 2013-05-09T04:27:29.920 回答