目次
前
次
グラフィック処理
グラフィック処理は、VC++であればデバイスコンテキストを
利用しました。
メモリ中に実際に表示される画像と同じ内容を、等価デバイス
コンテキストとして定義し、その中に描画します。
描画後、表示用デバイスコンテキストにデータをコピーして
おしまいにしていました。
このシーケンスと同じことを実行すると表示できました。
順を追って説明します。
表示のためのシーケンス
デバイスコンテキスト(DC)を利用していれば、メモリに
次のシーケンスで描画します。
- メモリ中に等価DCを用意
- 必要な描画処理は、WindowsAPIで指定
- 等価DCの内容を、表示DCにコピー
テキストファイルには、ピクセルごとの輝度が含まれています。
このピクセルごとの輝度を、R、G、Bの3成分の値にして、点を
打ってしまえば、画像描画が完成です。
シーケンスにすると、以下です。
- 画像サイズと同じだけのビットマップを用意
- 1ライン分のデータを、読み込み
- 1ライン分のピクセルごとに、R、G、Bの3成分の値に設定
- ピクセルのR、G、Bを指定
- 全ラインの処理が終わっていなければ、2に戻る
- ピクチャーボックスにビットマップの内容をコピー
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情報を
生成します。
目次
前
次