2013-05-09 68 views
2

我是clojure新手(我不知道任何Java可以说)。在没有临时磁盘文件的情况下调整clojure中的图像

我的目标是从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对象。

回答

2

使用read方法ImageIO需要URL作为参数并返回BufferedImage对象。

5

我刚刚创建了一个新的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功能分开,因此如果需要(例如进行测试),您可以在内存中执行与文件系统依赖关系的所有操作。

相关问题