Forum > Graphics

Define a bitmap inside the code


On April 26, 2004 the user pepecito asked if it was possible to generate a bitmap within the Lazarus code. Both intfgraphics.pas and the lazintfimage example program show how to open/save/manipulate a bitmap, but do not describe how to generate a bitmap on the fly. In my case, I want to be able to create a 32-bit bitmap that will be platform independent. Can anyone explain how to do this? Below is a very simple example from Delphi. If anyone can send me a Lazarus version of QuickBMP32, I will be forever in their debt and promise to post a sample program on the web so other users can solve this....


The Delphi program below assumes a form with a TImage component named Image1 and a TSpeedbutton named Speedbutton1. Clicking on SpeedButton1 calls SpeedButton1Click. Note that with Delphi >3 you can turn on doublebuffering to eliminate flicker:

--- Code: Pascal  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---type  //Delphi < 4: TRGBquad = PACKED RECORD rgbBlue,rgbGreen,rgbRed,rgbreserved: byte; end;  RGBQuadRA = array [1..1] of TRGBQuad;  RGBQuadp = ^RGBQuadRA; procedure QuickBMP32(lPGHt,lPGWid:integer; lBuff: RGBQuadp; var lImage: TImage);var sbBits : PByteArray; lBMP: TBitmap;begin         lBMP := TBitmap.Create;         lBMP.PixelFormat := pf32bit;         lBMP.Width := lPGwid;         lBMP.Height := lPGHt;         sbBits := lBmp.ScanLine[lPGHt-1];         CopyMemory(Pointer(sbBits),Pointer(lBuff),lPGWid*lPGHt * 4);         lImage.Width := (lBmp.Width);         lImage.Height := (lBmp.Height);         lImage.Picture.Graphic := lBMP;         lBMP.Free;end; //proc QuickBMP32 procedure TForm1.SpeedButton1Click(Sender: TObject);var        lHt,lWid,lH,lW,lI: integer;        lQuadP: RGBQuadp;begin  lHt := 255;  lWid := 511;  GetMem ( lQuadP ,  lHt*lWid*sizeof(TRGBquad));  lI := 0;  for lH := 1 to lHt do begin        for lW := 1 to lWid do begin                inc(lI);//indexed from zero                lQuadP[lI].rgbRed := lW mod 256 ;                lQuadP[lI].rgbGreen := lH mod 256 ;                if lW < 255 then                        lQuadP[lI].rgbBlue := 0                else                        lQuadP[lI].rgbBlue := 255;                lQuadP[lI].rgbReserved := 255;        end; //for lW: each column  end; //for lH: each row  QuickBMP32(lHt,lWid,lQuadP,Image1);  Freemem(lQuadP);end; procedure TForm1.FormCreate(Sender: TObject);begin Form1.DoubleBuffered := true;end;
[Edited to add code tags]


[0] Message Index

Go to full version