Thema: Delphi Rendering context opengl

Einzelnen Beitrag anzeigen

Arnulf

Registriert seit: 28. Okt 2004
Ort: Wien
271 Beiträge
 
#5

Re: Rendering context opengl

  Alt 28. Apr 2005, 10:21
Weil andere leute ebenfalls interesse hatten und damit der thread als beantwortet gelten kann poste ich mal die source für die screenshot routine mit open gl.

Damit wäre wohl alles komplett!
Es funktioniert - habs schon getestet

Speichern eine Screenshots als jpg:

Delphi-Quellcode:
procedure glSaveScreen(pFilename : String);
var
 Viewport : array[0..3] of TGLint;
 JPG : TJPEGImage;
 RGBBits : PRGBQuad;
 Pixel : PRGBQuad;
 BMP : TBitmap;
 Header : PBitmapInfo;
 x,y : Integer;
 Temp : Byte;
begin
glGetIntegerv(GL_VIEWPORT, @Viewport);
GetMem(RGBBits, Viewport[2]*Viewport[3]*4);
glFinish;
glPixelStorei(GL_PACK_ALIGNMENT, 4);
glPixelStorei(GL_PACK_ROW_LENGTH, 0);
glPixelStorei(GL_PACK_SKIP_ROWS, 0);
glPixelStorei(GL_PACK_SKIP_PIXELS, 0);
glReadPixels(0, 0, Viewport[2], Viewport[3], GL_RGBA, GL_UNSIGNED_BYTE, RGBBits);
// Screenshot als JPG speichern
JPG := TJPEGImage.Create;
BMP := TBitmap.Create;
BMP.PixelFormat := pf32Bit;
BMP.Width := Viewport[2];
BMP.Height := Viewport[3];
GetMem(Header, SizeOf(TBitmapInfoHeader));
with Header^.bmiHeader do
 begin
 biSize := SizeOf(TBitmapInfoHeader);
 biWidth := Viewport[2];
 biHeight := Viewport[3];
 biPlanes := 1;
 biBitCount := 32;
 biCompression := BI_RGB;
 biSizeImage := Viewport[2]*Viewport[3]*4;
 end;
// Rot und Blau vertauschen
Pixel := RGBBits;
for x := 0 to Viewport[2]-1 do
 for y := 0 to Viewport[3]-1 do
  begin
  Temp := Pixel.Red;
  Pixel.Red := Pixel.Blue;
  Pixel.Blue := Temp;
  inc(Pixel);
  end;
SetDIBits(Bmp.Canvas.Handle, Bmp.Handle, 0, Viewport[3], RGBBits, TBitmapInfo(Header^), DIB_RGB_COLORS);
//bmp.SaveToFile('bitmap.bmp');
JPG.CompressionQuality := 100;
JPG.Assign(BMP);
JPG.SaveToFile(pFileName);
FreeMem(Header);
FreeMem(RGBBits);
JPG.Free;
BMP.Free;
end;
  Mit Zitat antworten Zitat