ビットマップへの描画
ビットマップへの描画を行うには、イメージコントロールのキャンバスを使用し、そのイメージコントロールの適切なイベントにマウスイベントハンドラを接続します。一般には領域操作(塗りつぶし、長方形、多角線など)を使用します。領域操作は、高速で効率的な描画メソッドです。
個々のピクセルにアクセスする必要があるようなイメージを描画するには、ビットマップの ScanLine プロパティを使用すると効率的です。用途を汎用化するために、ビットマップピクセル形式を 24 ビットに設定し、ScanLine から返されたポインタを RGB の配列として扱うことができます。これ以外の設定では、ScanLine プロパティの本来の形式がわかっていないと処理できません。次の例は、一度に 1 行分のピクセルを取得するときの ScanLine の使い方を示しています。
procedure TForm1.Button1Click(Sender: TObject); // これは、Bitmap への直接描画の例 var x,y : integer; Bitmap : TBitmap; P : PByteArray; begin Bitmap := TBitmap.create; try Bitmap.LoadFromFile("C:\Program Files\Borland\Delphi 4\Images\Splash\256color\factory.bmp"); for y := 0 to Bitmap.height -1 do begin P := Bitmap.ScanLine[y]; for x := 0 to Bitmap.width -1 do P[x] := y; end; canvas.draw(0,0,Bitmap); finally Bitmap.free; end; end;
void __fastcall TForm1::Button1Click(TObject *Sender) { Graphics::TBitmap *pBitmap = new Graphics::TBitmap(); // これは、Bitmap への直接描画の例 Byte *ptr; try { pBitmap->LoadFromFile("C:\\Program Files\\Borland\\CBuilder\\Images\\Splash\\256color\\factory.bmp "); for (int y = 0; y < pBitmap->Height; y++) { ptr = pBitmap->ScanLine[y]; for (int x = 0; x < pBitmap->Width; x++) ptr[x] = (Byte)y; } Canvas->Draw(0,0,pBitmap); } catch (...) { ShowMessage("Could not load or alter bitmap"); } delete pBitmap; }