#xNNNNNNという16進RGB形式を色ごとに分解する - lisp-cookbook-ja/common-lisp GitHub Wiki
HTMLの色の指定などで利用される、16進のRGB形式(#00ff00 etc)ですが、色ごとに分解して扱うには、ldb等でビットフィールドを操作することになるでしょう。 下記では、#xNNNNNNという数値を、NN. NN. NN. のR、G、Bの数値とみなして分解し、他の形式(1を最高値に設定したsingle-floatの数値のリスト)に変換しています。
(defun |#xNNNNNN-to-(N.N N.N N.N)| (num)
(mapcar (lambda (x) (/ x 255s0))
(list (ldb (byte 8 16) num)
(ldb (byte 8 8) num)
(ldb (byte 8 0) num))))
使用例
;; LispWorks
(apply #'color:make-rgb
(|#xNNNNNN-to-(N.N N.N N.N)| #xabcdef))
;=> #(:RGB 0.67058826 0.8039216 0.9372549)
変更履歴
(defun |#xNNNNNN-to-(N.N N.N N.N)| (num)
(mapcar (lambda (x) (/ x 255s0))
(list (ldb (byte 8 16) num)
(ldb (byte 8 8) num)
(ldb (byte 8 0) num))))
で良いような気がします。
その通りでした! 当初255で割るコードでなかったのを、そのまま引き継いでいました。 頂いた例に変更しました。 --g000001