Вычисление значений rgb для BufferedImage - PullRequest
0 голосов
/ 20 марта 2010

Я использую следующий фрагмент для построения 32-битного целого числа, чтобы использовать с setRGB из BufferedImage


(bit-or (bit-shift-left a 24)
          (bit-or (bit-shift-left r 16)
              (bit-or (bit-shift-left g 8) b)))

после написания цветов при их чтении обнаруживаются неправильные цвета, есть ли ошибка в моей логике?

Ответы [ 2 ]

1 голос
/ 23 марта 2010

Я храню функцию байтов в int, которая преобразует последовательность байтов в число в моем misc.clj :

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

, это очень удобно.

1 голос
/ 22 марта 2010

Вы уверены, что у вас есть проблемы? Я попытался сгенерировать несколько значений на основе вашего метода и функционально эквивалентной альтернативы:

 (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.

...