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;