2010-03-20 10 views
0

J'utilise extrait suivant pour construire un nombre entier de 32 bits à utiliser avec setRGB de BufferedImageCalcul rgb vals pour BufferedImage


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

après avoir écrit les couleurs de les lire laisse apparaître les mauvaises couleurs est là une faute dans ma logique?

Répondre

1

Etes-vous sûr d'avoir un problème? J'ai essayé de générer quelques valeurs basées sur votre méthode et une alternative fonctionnellement équivalente:

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

et obtenu des valeurs identiques.

(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 

J'ai les mêmes numéros sur mon caculateur de poche.

Y at-il des arguments spécifiques que vous avez vu pour produire des résultats incorrects?

Peut-être que ce n'est pas une erreur dans cette logique mais en écrivant/en lisant les valeurs de l'image tamponnée.

+0

J'ai sauté sur le calcul que le problème était de mon côté mais c'était en fait l'image qui avait le problème. –

1

Je garde une fonction octets à int qui convertit une séquence d'octets en un certain nombre dans mon misc.clj:

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

il est à portée de main assez souvent.