目次

グラフィック処理

 グラフィック処理は、VC++であればデバイスコンテキストを
 利用しました。

 メモリ中に実際に表示される画像と同じ内容を、等価デバイス
 コンテキストとして定義し、その中に描画します。
 描画後、表示用デバイスコンテキストにデータをコピーして
 おしまいにしていました。

 このシーケンスと同じことを実行すると表示できました。
 順を追って説明します。


表示のためのシーケンス

 デバイスコンテキスト(DC)を利用していれば、メモリに  次のシーケンスで描画します。  テキストファイルには、ピクセルごとの輝度が含まれています。  このピクセルごとの輝度を、R、G、Bの3成分の値にして、点を  打ってしまえば、画像描画が完成です。  シーケンスにすると、以下です。  VC++では、DCの扱いが面倒でしたが、VC#ではオブジェクト  指向を取り入れているので、とても簡単に上記シーケンスを  コードに変換できます。 // generate area Bitmap bmp = new Bitmap(xlast, ylast); // store data to area for ( y = 0 ; y < ylast ; y++ ) { // get 1 line sline = stext.Substring(y*ysize,ysize); for ( x = 0 ; x < xlast ; x++ ) { // get value stmp = sline.Substring(3*x,2); // convert tmp = hex2digit(stmp[0]) * 16 + hex2digit(stmp[1]); // store pixel data bmp.SetPixel(x,y,Color.FromArgb(255,tmp,tmp,tmp)); } } // show picBox.Image = bmp ;  ビットマップの生成は、Bitmapクラスメソッドを使います。  幅、高さを指定して生成すると、メモリ中に等価DCを用意  したのと同じことになります。  幅、高さは、次のように定義します。 const int xlast = 512; const int ylast = 480;  今回は、512x480の画像を扱う指定ですが、上の定義を変更  すれば、どんなサイズの画像も思いのままです。  テキストファイルからは、一気呵成に輝度情報を文字列で  入力します。stringクラスメソッドSubstringを使い、2文字  ずつ取り出します。  文字列は、1次元配列であるとみなして、1ライン分の輝度  情報を、stext.Substring(y*ysize,ysize)で入力します。  1ピクセルの輝度を8ビットで表現し、16進2けたであると  想定しています。  ysizeは、次のように設定します。 const int ysize = 1537;  512個の2文字データに、区切りの文字を入れたとして   512x3 = 1536  512個目のデータには、区切りの文字を入れないので   512x3-1= 1535  1ラインの最後には、'\r'、'\n'が含まれるとして   1535+2=1537  と計算できます。  2文字データを、数値に変換するために、次の関数を定義しました。 private byte hex2digit(int x) { int result; result = 0 ; if ('0' <= x && x <= '9') { result = x - '0'; } if ('A' <= x && x <= 'F') { result = x - 'A' + 10; } if ('a' <= x && x <= 'f') { result = x - 'a' + 10; } return (byte)result; }  数字の0〜9、16進数とみなせるA〜F、a〜fを数値に変換します。  もっとうまい方法があると思いますが、自前関数で対応しました。  指定ピクセルの色を決めるには、Colorクラスメソッド  FromArgbを利用しました。  輝度、赤成分値、青成分値、緑成分値を指定すると  BitmapクラスメソッドSetPixelに必要なColor情報を  生成します。
目次

inserted by FC2 system