1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【C#】BGR形式をRGB形式に変換する

Posted at

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を入れ替える」という挙動になっています。
図示するとこんな感じ
BGRtoRGB.png

この挙動を実現するためにAND演算、OR演算、シフト演算の3種類の演算を組み合わせて使っています。

AND演算
AND演算とは2つのbitを比べて、両方が1の時は1、それ以外は0になるような演算のことです。
論理積とも呼ばれることがあります。

bit-and.png

例えば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-or.png

下記のような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)

となる

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?