- {***************************************************************************
- Screenshot erstellen
- ****************************************************************************}
- procedure TForm1.ScreenShot(sender: TObject);
- var
- BMPname : string;
- FileInfo : BITMAPINFOHEADER;
- FileHeader : BITMAPFILEHEADER;
- Viewport : array[0..3] of integer;
- RohBild,
- Bild : TBitmap;
- i : integer;
- begin
- // Testweise um ein unkontrolliertes Rendern während des Speicherns zu verhindern - bringt
- // aber auch nix...
- Timer1.enabled := false;
- // Backgrund = weiss
- glClearColor(1, 1, 1, 0);
- // Bisheriges Bild löschen
- glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
- // Bild neu aufbauen; letzte Zeile in Render ist übrigens glFinish;
- Render;
- //Snapshotroutine von WhiteHunter
- glGetIntegerv(GL_VIEWPORT, @Viewport);
- Rohbild := TBitmap.Create;
- try
- Rohbild.Width := Viewport[2];
- Rohbild.Height := Viewport[3];
- Rohbild.PixelFormat := pf24bit;
- for i := 0 to Viewport[3] - 1 do
- glReadPixels(0, Viewport[3] - i, Viewport[2], 1, GL_BGR, GL_UNSIGNED_BYTE, Rohbild.ScanLine[i]);
- // Eigentliches Bitmap mit Übermass erstellen
- Bild := TBitmap.Create;
- Bild.PixelFormat := pf24bit;
- Bild.Width := RohBild.Width + 225;
- Bild.Height := RohBild.Height + 100;
- // Beschriftungen einfügen
- Bild.Canvas.textout(10,Bild.Height-70 ,MaskEdit1.Text);
- Bild.Canvas.textout(10,Bild.Height-50 ,MaskEdit2.Text);
- Bild.Canvas.textout(10,Bild.Height-30 ,MaskEdit3.Text);
- .
- .
- .
- // Gepuffertes Bitmap ins eigentliche Bitmap
- Bild.Canvas.Draw ( 225,0,Rohbild);
- // Fertiges Bitmap speichern
- BMPname := Dateipfad + '-' + DateToStr(Date);
- SaveDialog1.FileName := BMPname;
- if SaveDialog1.Execute then BMPname:=SaveDialog1.FileName;
- Bild.SaveToFile(BMPname);
- finally
- // Bild.Free; ---> Diese auskommentierten Einträge bedeuten
- // RohBild.Free; ---> einen sicheren Programmabsturz ?!?
- end;
- // Background wieder auf schwarz stellen
- glClearColor(0, 0, 0, 0);
- glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
- // Timergesteuertes Rendern wieder freigeben
- Timer1.enabled := true;
- end;