通过 Ring 处理程序提供 BufferedImage
Serve a BufferedImage by a Ring handler
我正在寻找一种方法让环形服务器 - 根据请求 - 从 URL 抓取图像,处理它并提供修改后的版本。
到目前为止我是这样的:
(require '[clj-http.client :as client]
'[ring.adapter.jetty :refer [run-jetty])
(import javax.imageio.ImageIO)
(def handler (-> (client/get "http://.../some-img.jpg" {:as :stream})
:body
ImageIO/read
.. ;; do some processing with the BufferedImage here
.. ;; and serve the modified version))
(run-jetty handler {:port 55555})
尤其是我在线程宏中执行最后一步时遇到了问题。
到 return 字节作为 Ring 中的响应,您需要提供 java.io.File
or java.io.InputStream
作为正文内容:
(defn jpeg-response [image-data]
(-> image-data
(ring.util.response/response)
(ring.util.response/content-type "image/jpeg")))
我还没有找到直接从 BufferedImage
获取 InputStream
而无需创建中间字节数组的方法。也许这是 Java Image API 的限制,因为实现“拉”方法以获取所需格式的图像字节流所需的复杂性。
取而代之的是“推送”API,其中 ImageIO.write
方法需要某种图像字节输出。它可能是 java.io.File
或 java.io.OutputStream
。因此,您需要先将字节存储在某处(java.io.File
或 java.io.ByteArrayOutputStream
),然后将它们用作您的响应主体:
有文件(所以先把图片存到磁盘上-你需要记得清理它):
(let [image (ImageIO/read "...")
image-file (java.io.File. "...")]
(ImageIO/write image "jpg" image-file)
(jpeg-response image-file))
内存字节数组:
(let [image (ImageIO/read "...")
image-output-stream (ByteArrayOutputStream.)]
(ImageIO/write image "jpg" image-output-stream)
(jpeg-response (ByteArrayInputStream. (.toByteArray image-output-stream))))
我正在寻找一种方法让环形服务器 - 根据请求 - 从 URL 抓取图像,处理它并提供修改后的版本。
到目前为止我是这样的:
(require '[clj-http.client :as client]
'[ring.adapter.jetty :refer [run-jetty])
(import javax.imageio.ImageIO)
(def handler (-> (client/get "http://.../some-img.jpg" {:as :stream})
:body
ImageIO/read
.. ;; do some processing with the BufferedImage here
.. ;; and serve the modified version))
(run-jetty handler {:port 55555})
尤其是我在线程宏中执行最后一步时遇到了问题。
到 return 字节作为 Ring 中的响应,您需要提供 java.io.File
or java.io.InputStream
作为正文内容:
(defn jpeg-response [image-data]
(-> image-data
(ring.util.response/response)
(ring.util.response/content-type "image/jpeg")))
我还没有找到直接从 BufferedImage
获取 InputStream
而无需创建中间字节数组的方法。也许这是 Java Image API 的限制,因为实现“拉”方法以获取所需格式的图像字节流所需的复杂性。
取而代之的是“推送”API,其中 ImageIO.write
方法需要某种图像字节输出。它可能是 java.io.File
或 java.io.OutputStream
。因此,您需要先将字节存储在某处(java.io.File
或 java.io.ByteArrayOutputStream
),然后将它们用作您的响应主体:
有文件(所以先把图片存到磁盘上-你需要记得清理它):
(let [image (ImageIO/read "...")
image-file (java.io.File. "...")]
(ImageIO/write image "jpg" image-file)
(jpeg-response image-file))
内存字节数组:
(let [image (ImageIO/read "...")
image-output-stream (ByteArrayOutputStream.)]
(ImageIO/write image "jpg" image-output-stream)
(jpeg-response (ByteArrayInputStream. (.toByteArray image-output-stream))))