我正在使用以下代码片段构建一个32位整数,用于BufferedImage的setRGB
(bit-or (bit-shift-left a 24)
(bit-or (bit-shift-left r 16)
(bit-or (bit-shift-left g 8) b)))
在写完颜色后再读回它们会发现错误的颜色在我的逻辑中有错吗?
答案 0 :(得分:1)
你确定你有问题吗?我尝试根据您的方法和功能等效的替代方法生成一些值:
(defn argbval
[a r g b]
(bit-or (bit-shift-left a 24)
(bit-or (bit-shift-left r 16)
(bit-or (bit-shift-left g 8) b))))
(defn altargbval
[a r g b]
(+ (* 16777216 a) (* 65536 r) (* 256 g) b))
(defn -main
([& args]
(println "(argbval 25 21 23 29): " (argbval 25 21 23 29))
(println "(altargbval 25 21 23 29): " (altargbval 25 21 23 29))
(println "(argbval 0 0 0 0): " (argbval 0 0 0 0))
(println "(altargbval 0 0 0 0): " (altargbval 0 0 0 0))
(println "(argbval 255 255 255 255): " (argbval 255 255 255 255))
(println "(altargbval 255 255 255 255): " (altargbval 255 255 255 255))))
并获得相同的价值。
(argbval 25 21 23 29): 420812573
(altargbval 25 21 23 29): 420812573
(argbval 0 0 0 0): 0
(altargbval 0 0 0 0): 0
(argbval 255 255 255 255): 4294967295
(altargbval 255 255 255 255): 4294967295
我的口袋计算器上有相同的数字。
您是否看到过产生错误结果的具体论据?
也许这不是错误,而是写入/读取BufferedImage的值。
答案 1 :(得分:1)
我保留了一个bytes-to-int函数,它将一个字节序列转换为misc.clj中的数字:
(defn bytes-to-int [bytes]
(let [powers (iterate #(* % 256) 1)]
(reduce + 0 (map * bytes powers))))
经常使用它。