一个工作,但速度很慢的解决方案,从一个区域的平均颜色值
考虑一个Image
对象,它可能像这样创建:获取的图像
(import 'javax.imageio.ImageIO)
(import 'java.awt.Color)
(require '[clojure.java.io :as io])
(def img (ImageIO/read (io/file "/path/to/img.jpg")))
下面的函数提取来自Image
的区域的像素序列。每一个是由RGB值的向量表示:
(defn average-color [colors]
(mapv #(/ % (count colors))
(reduce (partial mapv +) colors)))
(这将被更优雅的载体实现的:
(defn get-pixels [img [x y] [w h]]
(for [x (range x (+ x w))
y (range y (+ y h))]
(let [c (Color. (.getRGB img x y))]
[(.getRed c) (.getGreen c) (.getBlue c)])))
(get-pixels img [0 0] [10 10])
;; ([254 252 240] [254 252 240] [254 252 240] [254 252 240] ...)
从这个结果,平均颜色可以通过该函数来计算库)
不过:这个现在可以捆绑,像这样,才能得到想要的结果:
(average-color (get-pixels img [0 0] [10 10]))
;; [254 252 240]
问题是它很慢,这并不令人惊讶。我猜瓶颈在get-pixels函数中,它为每个像素创建一个Color
对象。
(import 'java.awt.Rectangle)
(defn get-data [img [x y] [w h]]
(-> (.getData img (Rectangle. x y w h))
.getDataBuffer
.getData))
在相同的图像:
A和错误的结果
我试图用这个片段的工作更有前途的方法
(get-data img [0 0] [10 10])
;; #object["[B" 0x502f5b2a "[[email protected]"]
(vec *1)
;; [-1 -16 -4 -2 -1 -16 -4 -2 -1 -16 -4 -2 -1 -16 ...]
我无法弄清楚如何进一步处理这个输出以达到我的目的。
有谁知道,如何改善?
很好的答案!人们可以从中学到很多... –