Sir*_*ert 2 resize image clojure
我是一个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))))
Run Code Online (Sandbox Code Playgroud)
现在它从URL中抓取图像并将其写入磁盘,缓冲区到缓冲区.然后它从磁盘读取并在内存中调整图像大小,再次将其写入新文件.最后,我可以删除第一个副本.
我想在没有临时磁盘写入的情况下一次完成整个操作.我并不特别介意将整个图像存储在记忆中......就我的目的而言,它们通常都是小图像.
我不明白如何将数据从io流传递给java.awt.image.BufferedImage
对象.
我刚刚创建了一个新的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))
Run Code Online (Sandbox Code Playgroud)
保持图像处理操作与IO功能分离可能是一个好主意,这样如果需要(例如测试),您可以在内存中处理所有文件系统依赖项.