一個工作,但速度很慢的解決方案,從一個區域的平均顏色值
考慮一個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 ...]
我無法弄清楚如何進一步處理這個輸出以達到我的目的。
有誰知道,如何改善?
很好的答案!人們可以從中學到很多... –