eraシリーズ改造/バリアント開発の覚え書き

16進数カラーコードからRGB値を取得したい


0xFFCC66のような16進数カラーコードからRGB値をばらばらに取得したい場合は、右方向へのビットシフトの後、必要な桁以外にビットマスクをかけて除外すればよい。
6桁の16進数コードを2桁ずつに分解すれば上から順にR、G、Bの値が取れる。16進数は1桁あたり4bitなので、2桁シフトするには8bitシフトすればいい。Rなら16bit右にビットシフトする。Bはもともと下2桁にあるのでビットシフトする必要はない。

0xFFCC66 >> 8
;->0x00FFCC

下2桁に取得したい値があるので、後は上位の桁をビットマスクで除外する。0xFFとのビット積を求めればいい。

0x00FFCC & 0xFF
;->0x0000CC

百聞は一見にしかず。

LOCAL = 0xFFCC66

;Rを取得 16bitシフトしてからマスク
R = LOCAL >> 16 & 0xFF
;Gを取得 8bitシフトしてからマスク
G = LOCAL >> 8 & 0xFF
;Bを取得 最初から下二桁にあるので上位をマスクするだけでいい
B = LOCAL & 0xFF

PRINTFORM %TOSTR(R, "X2")%, 
PRINTFORM %TOSTR(G, "X2")%, 
PRINTFORM %TOSTR(B, "X2")%
;-> 0xFF, 0xCC, 0x66

逆にRGBそれぞれの値から16進カラーコードを取得するにはどうすればいいだろうか。
そういうときは、上で行ったのとは逆の計算をすればいい。つまり、逆方向にシフトした後、各値のビット和を求めるわけだ。

R = 255
G = 143
B = 95

LOCAL = R << 16 | G << 8 | B
PRINTFORM %TOSTR(LOCAL, "X2")%
;->0xFF8F5F

ビット演算は理解しにくい部分もあるが、ある種のイディオムとして覚えてしまうというのもひとつの手で、上記のコードもそういう類のものだろう。もちろん理解しておいて損はないが、その取っ掛かりとして、たとえば「0xFFとのビット積を求めるとどうして下位8ビットが取得できるのか」ということからはじめてみてもいいと思う。下位8ビットを取得して何がうれしいのかは、今回の例が示しているわけだし。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

リンク

漠々ト、獏
eramaker/eramaker2の開発元の公式サイト。

Emuera - emurator of eramaker
C#で書かれたeramakerのエミュレータ「Emuera」のプロジェクトページ。

eraシリーズを語るスレ まとめ
eraシリーズ全般のまとめ。バリアント情報、改造情報など。

eratoho まとめ
eramakerのバリアント「eratoho」のまとめ。

era板
eraシリーズについての掲示板。

サブページ

Rubiera
Bitbucket上のRubieraプロジェクトページ。Rubieraのソースコードのダウンロードはここで。

管理人/副管理人のみ編集できます