If you only have to display an image on the form, you can use the TImage component and load the bitmap into its Picture property. But if you want to do anything more complex with bitmap images, you should use the TBitmap class. The TBitmap class is a great class that enables you to load, save, and process bitmap images.
The TCanvas class has several methods that enable you to draw bitmap images. The three most often used methods are Draw, StretchDraw, and CopyRect. The Draw and StretchDraw methods enable you to draw entire images, while the CopyRect method enables you to draw portions of the bitmap, as shown in Figure 22-16.
Figure 22-16: Drawing bitmaps on the canvas
Carefully look at the comments (and the code, of course) in Listing 22-16 to see how to work with and draw bitmap images.
Listing 22-16: Drawing bitmaps
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TMainForm = class(TForm) procedure FormPaint(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } FImage: TBitmap; public { Public declarations } end; var MainForm: TMainForm; implementation {$R *.dfm} procedure TMainForm.FormCreate(Sender: TObject); var imagePath: string; begin { create and load the image here, actually - always do as much as you can outside of the OnPaint event handler, write only what's necessary in OnPaint } FImage := TBitmap.Create; imagePath := ExtractFilePath(Application.ExeName) + 'image.bmp'; FImage.LoadFromFile(imagePath); end; procedure TMainForm.FormDestroy(Sender: TObject); begin { don't forget to release the bitmap from memory } FImage.Free; end; procedure TMainForm.FormPaint(Sender: TObject); var srcRect: TRect; destRect: TRect; txtHeight: Integer; begin with Canvas do begin Font.Color := clYellow; Font.Size := 16; txtHeight := TextHeight('Wg'); end; // with Canvas { draw the entire image } Canvas.TextOut(10, 0, 'Draw'); Canvas.Draw(10, txtHeight, FImage); { draw the image stretched in a 400x100 rect } Canvas.TextOut(10, FImage.Height + (txtHeight * 2), 'StretchDraw'); srcRect := Rect(10, FImage.Height + txtHeight * 3, 410, FImage.Height + (txtHeight * 3) + 100); Canvas.StretchDraw(srcRect, FImage); { draw the 100x100 top-left rect of the image } Canvas.TextOut(FImage.Width + 20, 0, 'CopyRect'); srcRect := Rect(0, 0, 100, 100); destRect := Rect(FImage.Width + 20, txtHeight, FImage.Width + 120, txtHeight + 100); Canvas.CopyRect(destRect, FImage.Canvas, srcRect); end; end.