RGBの分割と結合をしてみる

寄稿:東條遼平

RGB情報を分割

せっかくRGB情報が別々に分かれているのでRならRだけ,GならGだけ,BならBだけの情報でグレースケールを作れるようにしてみました.つまり元の画像のRGBの,RをRGB全てに入れたもの,Gを全てに入れたもの,Bを全てに入れたものの3枚を作成します.

   void RGBDivision(Image *colorimg, Image *Rimg,
                                       Image *Gimg, Image *Bimg)
   {
     unsigned int i;

     for(i=0; i<(colorimg->width)*(colorimg->height); i++){
       Rimg->data[i].r = Rimg->data[i].g = 
                              Rimg->data[i].b = colorimg->data[i].r;
       Gimg->data[i].r = Gimg->data[i].g = 
                              Gimg->data[i].b = colorimg->data[i].g;
       Bimg->data[i].r = Bimg->data[i].g = 
                              Bimg->data[i].b = colorimg->data[i].b;
     }
   }

この関数を呼び出す前に引数として渡すRimg,Gimg,Bimgについては先に作成したCreate_Imageでcolorimgと同じwidth, heightを渡し, dataの領域を確保しておく必要があります.もちろん使い終わればFree_Imageします.

RGB情報を結合

RGB情報を分割したら結合もしてみたくなります.分割では1枚のRGB情報で3枚の画像を作成しましたが,今度は3枚のRGB情報を用いて1枚のカラー画像を作成します.つまり分割の時のほぼ逆変換を行います.「ほぼ逆変換」というのは3枚の画像がグレースケールで無くてもいいというのと,必ずしも同じ画像で無くてもいいからです.下にソースを載せますが,プログラム上dataはcolorimgのwidth,height分しか参照されません.そのため3枚の原画像が全てcolorimgよりもサイズの大きい画像であれば問題ありません.ただ,それができるからといって何の役にも立たない気もしますが.

   void RGBCombination(Image *Rimg, Image *Gimg, Image *Bimg,
                                                   Image *colorimg)
   {
     unsigned int i;

     for(i=0; i<(colorimg->width)*(colorimg->height); i++){
       colorimg->data[i].r = Rimg->data[i].r;
       colorimg->data[i].g = Gimg->data[i].g;
       colorimg->data[i].b = Bimg->data[i].b;
     }
   }

用途

とりあえず思い付きで作ってみた関数なので,なんの役に立つか疑問だったのですが,よく考えてみると原画像のRGBのそれぞれの値がRGGになっている画像を作成したりできます.また例えばRGB情報のRの情報にだけフィルタをかけるといった事もでき,面白い画像ができあがりました.フィルタについてはこれから載せていこうと思いますが,とりあえず今回はRGBのそれぞれの値をRGGにするmain.cのコードにしておきます.

Valid XHTML 1.1! home > コンピュータ > プログラミング >
リロード   新規 編集 凍結 差分 添付 複製 改名   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS
Modified by 物理のかぎプロジェクト PukiWiki 1.4.5_1 Copyright © 2001-2005 PukiWiki Developers Team. License is GPL.
Based on "PukiWiki" 1.3 by yu-jiPowered by PHP 5.2.17HTML convert time to 0.079 sec.