Developing with Graphics

From Lazarus wiki
Revision as of 18:58, 31 March 2005 by Matthijs (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Overview

This page will be the start for all tutorials with regard to manipulating Bitmaps and other graphics in your program. As I'm not a graphics programmer I invite all who are to share their expertise! Just add a link to this page and create your own WiKi article. On this page some general information will be given.

Working with TBitmap

The first thing to remember is that Lazarus is meant to be platform independent, so any methods using Windows API functionality are out of the question. So a method like ScanLine is not supported by Lazarus because it is intended for Device Independant Bitmap and uses functions from the GDI32.dll. So this takes care of the FAQ: Why is there no ScanLine in Lazarus?

An fading example

Say you want to make a Fading picture. In Delphi you could do something like:

procedure FadeIn(ImageFileName: TFileName); 
var 
  Bitmap, BaseBitmap: TBitmap; 
  Row, BaseRow: PRGBTripleArray; 
  x, y, step: integer; 
begin 
  Bitmap := TBitmap.Create; 
  try 
    Bitmap.PixelFormat := pf32bit;  
    Bitmap.LoadFromFile(ImageFileName); 
    BaseBitmap := TBitmap.Create; 
    try 
      BaseBitmap.PixelFormat := pf32bit; 
      BaseBitmap.Assign(Bitmap); 
      for step := 0 to 32 do begin 
        for y := 0 to (Bitmap.Height - 1) do begin 
          BaseRow := BaseBitmap.Scanline[y]; 
          Row := Bitmap.Scanline[y]; 
          for x := 0 to (Bitmap.Width - 1) do begin 
            Row[x].rgbtRed := (step * BaseRow[x].rgbtRed) shr 5; 
            Row[x].rgbtGreen := (step * BaseRow[x].rgbtGreen) shr 5; // Fading 
            Row[x].rgbtBlue := (step * BaseRow[x].rgbtBlue) shr 5; 
          end; 
        end; 
        Form1.Canvas.Draw(0, 0, Bitmap); 
        InvalidateRect(Form1.Handle, nil, False); 
        RedrawWindow(Form1.Handle, nil, 0, RDW_UPDATENOW); 
      end; 
    finally 
      BaseBitmap.Free; 
    end; 
  finally 
    Bitmap.Free; 
  end; 
end;

This function in Lazarus could be implemented like:

procedure TForm1.FadeIn(ABitmap: TBitmap; x, y: integer);
var
  SrcIntfImg, TempIntfImg: TLazIntfImage;
  ImgHandle,ImgMaskHandle: HBitmap;
  FadeStep: Integer;
  px, py: Integer;
  CurColor: TFPColor;
  TempBitmap: TBitmap;
begin
  SrcIntfImg:=TLazIntfImage.Create(0,0);
  SrcIntfImg.LoadFromBitmap(ABitmap.Handle,ABitmap.MaskHandle);
  TempIntfImg:=TLazIntfImage.Create(0,0);
  TempIntfImg.LoadFromBitmap(ABitmap.Handle,ABitmap.MaskHandle);
  TempBitmap:=TBitmap.Create;
  for FadeStep:=1 to 32 do begin
    for py:=0 to SrcIntfImg.Height-1 do begin
      for px:=0 to SrcIntfImg.Width-1 do begin
        CurColor:=SrcIntfImg.Colors[px,py];
        CurColor.Red:=(CurColor.Red*FadeStep) shr 5;
        CurColor.Green:=(CurColor.Green*FadeStep) shr 5;
        CurColor.Blue:=(CurColor.Blue*FadeStep) shr 5;
        TempIntfImg.Colors[px,py]:=CurColor;
      end;
    end;
    TempIntfImg.CreateBitmap(ImgHandle,ImgMaskHandle,false);
    TempBitmap.Handle:=ImgHandle;
    TempBitmap.MaskHandle:=ImgMaskHandle;
    Canvas.Draw(x,y,TempBitmap);
  end;
  SrcIntfImg.Free;
  TempIntfImg.Free;
  TempBitmap.Free;
end;