0

我正在使用以下代码段来构建一个 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)))

写完颜色后,读回来显示错误的颜色是我的逻辑有问题吗?

4

2 回答 2

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。

于 2010-03-22T18:00:00.250 回答
1

我在misc.clj中保留了一个 bytes-to-int 函数,该函数将字节序列转换为数字:

(defn bytes-to-int [bytes] 
     (let [powers (iterate #(* % 256) 1)]
       (reduce + 0 (map * bytes powers))))

它经常派上用场。

于 2010-03-23T00:10:07.947 回答