gpt4 book ai didi

clojure - 通过 Ring 处理程序提供 BufferedImage

转载 作者:行者123 更新时间:2023-12-02 20:58:18 24 4
gpt4 key购买 nike

我正在寻找一种方法,让环形服务器根据请求从 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})

特别是我在执行线程宏内的最后一步时遇到了麻烦。

最佳答案

要在 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.Filejava.io.OutputStream。因此,您需要首先将字节存储在某处(java.io.Filejava.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))))

关于clojure - 通过 Ring 处理程序提供 BufferedImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37629007/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com