Qt/Gcc


8-1.カラーバーの生成
 画像のパターンにカラーバー(fig1)があります。このカラーバーを生成するプログラムを作成します。
     
      fig1 カラーバー

 8-1-1 カラーバー作成の考え方
  カラーバーは、上記図1のように白(Wh)、黄色(Ye)、シアン(Cy)、緑(G)、マゼンタ(Mg)、赤(R)、青(B)、黒(Bk)
  8色で構成されています。これらの色は赤(R)、緑(G)、青(B)の三色を決まった比率で合成して、色をつくり
  かつ、決まった領域に作った色をつけます。
具体的な内容をfig2を使って説明します。
 
             fig.2 カラーバーでのR、G、Bの比率 (注意:Xsize/8=32はXsizeが256の場合 )

 上記fig2の例は、R、G、Bの値が各8ビット(0〜255)の値をとるとした場合の各領域の値を示しています。
そして、縦、横のサイズを256×256とした場合、各領域の横方向のサイズwidthは256/8=32となります。
つまり、横方向(x方向)32単位でR、G、Bの値を0か255に設定していきます。

補足:補色という言葉を聞くと思います。これはR、G、Bに対して、Cy、Mg、Yeになります。
上記のレベルグラフをみると、Rの補色Cyは、R以外の色で構成されている色になります。
Gに対する補色Mgは、G以外の色、Bの補足はB以外の色で構成されています。
R、G、Bの順番とCy、Mg、Yeの順番がそれぞれ補足として対応してるので覚えやすいかもしれません。
そしてCy、Mg、Yeをすべて合成すると黒になります。R、G、Bは白です。 

●プログラム
プログラムは単純なループとif分の構成です。
ループの内容について説明します。
            //Rデータの作成
            if(((j>=0) && (j<2*width))||
                ((j>=4*width) && (j<6*width)))
                    rimage[i*xsize+j]=255;
                else
                    rimage[i*xsize+j]=0;

ループ内はR、G、B各色の値を領域(長方形部分)毎に0か255を設定しています。
fig.2と対比して確認してもらえば理解が早いと思います。
プログラム中のwidthが各色の領域のx方向の幅です。fig.2と対応してくと、
if文の一行目で0〜63(2*width)画素の領域でR(rimege配列)のデータ値を255に設定しています。
次に64〜127までは0、そして、128〜192が255、最後に193〜255が0となります。
これ以降のif分は、それぞれ、G、Bのデータを作っています。G、BもRと同じく、fig.2に対応した
領域毎に値を0か255に設定しています。

以下にプログラム(関数を示します)
//unsigned char *rimage   R(赤)のデータ格納用1次元配列
//unsigned char *gimage   G(緑)のデータ格納用1次元配列
//unsigned char *bimage   B(青)のデータ格納用1次元配列
//int xsize,int ysize 配列のサイズ(カラーバーのサイズ、ここに、256などの数字を入れる)
//配列は事前に確保する。配列のサイズはxsize*ysize
void MakeColorBar(unsigned char *rimage, unsigned char *gimage, unsigned char *bimage,int xsize,int ysize)
{
    int i,j,width;
    width = xsize/8;//白と黒を含めて8色あるので、8等分している
    for(i=0;i<ysize;i++){//y方向を固定してx方向にデータを書き込んでいく
        for(j=0;j<xsize;j++){
   //Rデータの作成
            if(((j>=0) && (j<2*width))||
                ((j>=4*width) && (j<6*width)))
                    rimage[i*xsize+j]=255;
                else
                    rimage[i*xsize+j]=0;
   ///////////////////////////////////////
   //Gデータの作成
            if((j>=0) && (j<4*width))
                gimage[i*xsize+j]=255;
            else
                gimage[i*xsize+j]=0;
   ///////////////////////////////////////
   //Bデータの作成
            if(((j>=0) && (j<width))||
                ((j>=2*width) && (j<3*width))||
                ((j>=4*width) && (j<5*width))||
                ((j>=6*width) && (j<7*width)))
                    bimage[i*xsize+j]=255;
            else
                bimage[i*xsize+j]=0;
            }
        }
}


トップページに戻る