BGRとRGBの仕様
BGRやRGBは色を表現する際のビット列の順序形式です。
BGR (Blue, Green, Red)
24bitで表現され、上位から
bit | 解釈 |
---|---|
1-8 | 青の輝度 |
9-16 | 緑の輝度 |
17-24 | 赤の輝度 |
16進数で表すと
0xBBGGRR
RGB (Red, Green, Blue)
24bitで表現され、上位から
bit | 解釈 |
---|---|
1-8 | 赤の輝度 |
9-16 | 緑の輝度 |
17-24 | 青の輝度 |
16進数で表すと
0xRRGGBB
コード
public static int BGRtoRGB(int bgr)
{
int red = (bgr & 0x0000FF) << 16;
int green = (bgr & 0x00FF00);
int blue = (bgr & 0xFF0000) >> 16;
return red | green | blue;
}
解説
やっていることは単純で、「赤と青のbitを入れ替える」という挙動になっています。
図示するとこんな感じ
この挙動を実現するためにAND演算、OR演算、シフト演算の3種類の演算を組み合わせて使っています。
AND演算
AND演算とは2つのbitを比べて、両方が1の時は1、それ以外は0になるような演算のことです。
論理積とも呼ばれることがあります。
例えばbgrでbgr(例では0x921E16)の赤色の輝度を算出したいときには
bgr & 0x0000FF
とすると
000000000000000011111111 // 0x0000FF
100100100001111000010110 // rgb(0x921E16)
000000000000000000010110 // 赤色の輝度(0x000016)
赤色(17bit目から24bit目)までが算出できます。
シフト演算
シフト演算はbit列を左または右にずらす演算のことです。
左にずらすことを左シフト、右にずらすことを右シフトといいます。
000000000000000000010110 << 16 // 左シフト
000101100000000000000000 // シフト演算結果
上の例では16bit分だけ左シフトしたものになります。
左へずらした際に桁があふれたビットは廃棄され、0のビットが右から入ります。
これによってBGR <=> RGBの変換をする際にBとRの入れ替えを行っています。
OR演算
OR演算は2つのbitを比べて、両方が0の時は0、それ以外は1になるような演算のことです。
論理和とも呼ばれることがあります。
下記のようなbit列があったとして
RRRRRRRR0000000000000000 // redのbit列(Rは0か1)
00000000GGGGGGGG00000000 // greenのbit列(Gは0か1)
0000000000000000BBBBBBBB // Blueのbit列(Bは0か1)
これをOR演算すると
RRRRRRRRGGGGGGGGBBBBBBBB // RGBのbit列(R,G,Bは0か1)
となる