Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image 在clojure中调整图像大小而不使用临时磁盘文件_Image_Clojure_Resize - Fatal编程技术网

Image 在clojure中调整图像大小而不使用临时磁盘文件

Image 在clojure中调整图像大小而不使用临时磁盘文件,image,clojure,resize,Image,Clojure,Resize,我是一个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-op

我是一个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.buffereImage
对象。

使用
ImageIO
方法,该方法将
URL
作为参数,并返回
buffereImage
对象。

我刚刚创建了一个新的库,您可能会发现它有一个
缩放图像
函数,该函数在缩放图像时应完全满足您的要求:

(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功能分开可能是一个好主意,这样,如果需要(例如测试),您可以在内存中完成所有操作,而不需要依赖文件系统。

(->url(IO/输入流)(imagez/加载图像)(imagez/缩放图像w h))