Loading a BitMap
Loading a .BMP file from file and displaying it in Delphi
Step 1:
Loading function

function LoadBitmapFile(FileName: String): HBitmap;
var
  F: Integer;                 //File Handle for Windows file functions
  DC: HDC;                    //Drawing context for application
  Size, N: Longint;           //Size of bitmap, Size of color spec
  P: PBitmapInfo;             //Windows bitmap format info header
  Header: TBitmapFileHeader;  //Bitmap file header
  Cs: PChar;
  PCs: Pointer;
  BytesRead: LongInt;
begin
  //This procedure is based on the old LoadBitMapFile from Borland Pascal v1.5 and updated to Delphi 3

  F := CreateFile(PChar(FileName), GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, Open_Existing, 0, 0);

  if F = INVALID_HANDLE_VALUE then
    begin
      Result := 0;
      Exit;
    end;

  //Read in the Bitmap file header
  Pcs := Addr(Header);
  ReadFile(F, PCs^, SizeOf(Header), BytesRead, nil);

  //Standard Bitmaps have Header.bfType=$4d42 or Header.bfType = $7000

  //Read the rest of the file
  Size := GetFileSize(F, nil) - SizeOf(TBitmapFileHeader);
  GetMem(P, Size);
  ReadFile(F, P^, Size, BytesRead, nil);
  N := Header.bfOffBits - SizeOf(TBitmapFileHeader);
  PCs := P;
  Cs := PCs;
  Cs := Cs + N;

  //Create the Bitmap
  DC := GetDC(0);
  Result := CreateDIBitmap(DC, P^.bmiHeader, cbm_Init, Cs, P^, dib_RGB_Colors);

  //Clean up
  ReleaseDC(0, DC);
  FreeMem(P, Size);
  CloseHandle(F);
end;
Step 2:
Wrapper function

procedure LoadAndDisplay(DestinationWindow: THandle; BitmapFileName: String);
var
  Dc, MemDc, Image: THandle;
  V: Windows.TBitmap;
begin
  //Set up Device Contexts
  Dc := GetDc(DestinationWindow);
  MemDC := CreateCompatibleDC(DC);
  Image := LoadBitMapFile(BitmapFileName);
  //Get dimensions of bitmap
  GetObject(Image, SizeOf(Windows.TBitmap), @V);
  //Select the bitmap into memory
  Image := SelectObject(MemDC, Image);
  //Display
  BitBlt(DC, 0, 0, V.bmWidth, V.bmHeight, MemDC, 0, 0, MergeCopy);
  //Remove the BitMap from memory
  Image := SelectObject(MemDC, Image);
  //Delete Bitmap
  DeleteObject(Image);
  //Remove Device Contexts
  DeleteDC(MemDC);
  ReleaseDC(DestinationWindow, DC);
end;
Step 3:
Apply

procedure TForm1.Button1Click(Sender: TObject);
begin
  LoadAndDisplay(Handle, 'city.bmp');
end;
Notes:
I intentionally ignored Header.bfType fields which can be used to avoid errors like loading non-BMP files. Optimumly, you'll want a few "IF"s to make sure the user can't load a .JPG that was renamed as .BMP
Home