计算 BufferedImage 的 rgb 值

发布于 2024-08-26 10:18:55 字数 245 浏览 5 评论 0原文

我正在使用以下代码片段构建一个 32 位整数,以便


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

在写入颜色后与 BufferedImage 的 setRGB 一起使用,读回它们会发现错误的颜色,我的逻辑是否有错误?

I am using following snippet to build a 32 bit integer to use with setRGB of BufferedImage


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

after writing colors reading them back reveals wrong colors is there a fault in my logic?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

软糯酥胸 2024-09-02 10:18:55

你确定你有问题吗?我尝试根据您的方法和功能等效的替代方案生成一些值:

 (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 写入/读取值时的错误。

Are you sure you have a problem? I tried generating a few values based on your method and a functionally equivalent alternative:

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

and got identical values.

(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

I got the same numbers on my pocket caculator.

Are there specific arguments that you have seen to produce incorrect results?

Perhaps it isn't a fault in this logic but in writing/reading the values to the BufferedImage.

知你几分 2024-09-02 10:18:55

我在我的 misc.clj

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

它经常很方便。

I keep a bytes-to-int function that converts a sequence of bytes into a number in my misc.clj:

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

it comes handy fairly often.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文