Sign in Join
Wiki copytemporary

Developing with Graphics/nl: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11## Overview
22
33Deze pagina is de start voor lessen die betrekking hebben op het manipuleren van Bitmap en plaatjes in andere formats. Ik ben geen graphics programmeur, dus iedereen die wel veel met graphics programmeert zou ik willen vragen om deze pagina uit te breiden. Gewoon door een link te maken in de sectie hieronder en dan een Wiki-pagina te vullen. Op deze pagina zal ik een klein voorbeeldje geven van hoe je een fading plaatje kunt maken.
44
55## Lessen in het programmeren met Graphics
66
77- Werken met een bitmap
88-
99
1010## Werken met TBitmap
1111
1212Allereerst even een FAQ beantwoorden: Waarom is er (nog) geen ScanLine in Lazarus? Zoals bekend is, moet Lazarus platform onafhankelijk zijn. Dit heeft tot gevolg tot methodes die gebruik maken van de Windows API niet tot de mogelijkheden behoren. ScanLine is zo'n method. ScanLine werkt met DIBs (Device Independant Bitmap) en gebruikt daarbij een aantal functies uit de GDI32.dll.
1313
1414### Een "fading" voorbeeld
1515
1616Zoals gezegd zou ik hier laten zien hoe je een plaatje langzaam kunt laten opkomen. Een echte Nederlandse term for fading ken ik niet echt. In Delphi zou je volgende doen, omdat het pixel voor pixel benaderen van een plaatje erg langzaam is:
1717
1818`type`\
1919`  PRGBTripleArray = ^TRGBTripleArray;`\
2020`  TRGBTripleArray = array[0..32767] of TRGBTriple;`\
21-\
21+
2222`procedure TForm1.FadeIn(aBitMap: TBitMap);`\
2323`var`\
2424`  Bitmap, BaseBitmap: TBitmap;`\
2525`  Row, BaseRow: PRGBTripleArray;`\
2626`  x, y, step: integer;`\
2727`begin`\
2828`  Bitmap := TBitmap.Create;`\
2929`  try`\
3030`    Bitmap.PixelFormat := pf32bit;  //  or pf24bit`\
3131`    Bitmap.Assign(aBitMap);`\
3232`    BaseBitmap := TBitmap.Create;`\
3333`    try`\
3434`      BaseBitmap.PixelFormat := pf32bit;`\
3535`      BaseBitmap.Assign(Bitmap);`\
3636`      for step := 0 to 32 do begin`\
3737`        for y := 0 to (Bitmap.Height - 1) do begin`\
3838`          BaseRow := BaseBitmap.Scanline[y];`\
3939`          Row := Bitmap.Scanline[y];`\
4040`          for x := 0 to (Bitmap.Width - 1) do begin`\
4141`            Row[x].rgbtRed := (step * BaseRow[x].rgbtRed) shr 5;`\
4242`            Row[x].rgbtGreen := (step * BaseRow[x].rgbtGreen) shr 5; // Fading`\
4343`            Row[x].rgbtBlue := (step * BaseRow[x].rgbtBlue) shr 5;`\
4444`          end;`\
4545`        end;`\
4646`        Form1.Canvas.Draw(0, 0, Bitmap);`\
4747`        InvalidateRect(Form1.Handle, nil, False);`\
4848`        RedrawWindow(Form1.Handle, nil, 0, RDW_UPDATENOW);`\
4949`      end;`\
5050`    finally`\
5151`      BaseBitmap.Free;`\
5252`    end;`\
5353`  finally`\
5454`    Bitmap.Free;`\
5555`  end;`\
5656`end;`
5757
5858In Lazarus is er geen ScanLine en moeten we het dus op een andere manier doen. Hoewel deze manier niet zo snel is als de ScanLine methode is die wel veel sneller dan de Pixel\[x,y\] methode in Delphi.
5959
6060`procedure TForm1.FadeIn(ABitMap: TBitMap);`\
6161`var`\
6262`  SrcIntfImg, TempIntfImg: TLazIntfImage;`\
6363`  ImgHandle,ImgMaskHandle: HBitmap;`\
6464`  FadeStep: Integer;`\
6565`  px, py: Integer;`\
6666`  CurColor: TFPColor;`\
6767`  TempBitmap: TBitmap;`\
6868`begin`\
6969`  SrcIntfImg:=TLazIntfImage.Create(0,0);`\
7070`  SrcIntfImg.LoadFromBitmap(ABitmap.Handle,ABitmap.MaskHandle);`\
7171`  TempIntfImg:=TLazIntfImage.Create(0,0);`\
7272`  TempIntfImg.LoadFromBitmap(ABitmap.Handle,ABitmap.MaskHandle);`\
7373`  TempBitmap:=TBitmap.Create;`\
7474`  for FadeStep:=1 to 32 do begin`\
7575`    for py:=0 to SrcIntfImg.Height-1 do begin`\
7676`      for px:=0 to SrcIntfImg.Width-1 do begin`\
7777`        CurColor:=SrcIntfImg.Colors[px,py];`\
7878`        CurColor.Red:=(CurColor.Red*FadeStep) shr 5;`\
7979`        CurColor.Green:=(CurColor.Green*FadeStep) shr 5;`\
8080`        CurColor.Blue:=(CurColor.Blue*FadeStep) shr 5;`\
8181`        TempIntfImg.Colors[px,py]:=CurColor;`\
8282`      end;`\
8383`    end;`\
8484`    TempIntfImg.CreateBitmap(ImgHandle,ImgMaskHandle,false);`\
8585`    TempBitmap.Handle:=ImgHandle;`\
8686`    TempBitmap.MaskHandle:=ImgMaskHandle;`\
8787`    Canvas.Draw(0,0,TempBitmap);`\
8888`  end;`\
8989`  SrcIntfImg.Free;`\
9090`  TempIntfImg.Free;`\
9191`  TempBitmap.Free;`\
9292`end;`
9393
9494De Lazarus code op deze pagina is overgenomen uit het \$LazarusPath/examples/lazintfimage/fadein1.lpi project. Dus als je echt een vliegende start in het programmeren van plaatjes wilt hebben moet dat voorbeeld eens bestuderen.
9595
9696---
9797*From the Free Pascal wiki, page "Developing with Graphics/nl", as it stood on 2005-10-23 after a change by Sekelsenmat, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history