#xNNNNNNという16進RGB形式を色ごとに分解する


Tag: 数値

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