// =============================================================================
// glSaveScreen
// =============================================================================
// Speichert einen Screenshot des aktuellen Pufferinhaltes
// =============================================================================
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);
JPG.CompressionQuality := 100;
JPG.Assign(BMP);
JPG.SaveToFile(pFileName);
FreeMem(Header);
FreeMem(RGBBits);
JPG.Free;
BMP.Free;
end;