- procedure ScreenShotJPG(Filename : string; Compression : integer);
- var
- buffer: array of byte;
- i, c, temp: integer;
- f: file;
- t, FN, FN2, FN3 : string;
- SSDir : string;
- JPEGImage: TJPEGImage;
- Bitmap : TBitmap;
- begin
- // create the scrnshots directory if it doesn't exist
- SSDir := extractfiledir(Paramstr(0))+'\ScreenShots';
- FN2 := extractfilename(Filename);
- FN2 := copy(FN2,1,length(FN2)-length(Extractfileext(FN2)));
- // sys_mkdir
- {$I-}
- CreateDir(SSDir);
- // MkDir(SSDir);
- {$I+}
- FN := SSDir+FN2;
- for i := 0 to 999 do
- begin
- t := inttostr(i);
- if length(t) < 3 then
- t := '00'+t
- else
- if length(t) < 2 then
- t := '0'+t;
- if not fileexists(FN+'_'+t+'.jpg') then
- begin
- FN3 := FN+'_'+t+'.jpg';
- break;
- end;
- end;
- if FN3 = '' then
- begin
- exit;
- end;
- Bitmap := TBitmap.Create;
- Bitmap := ScreenShot_BitmapResult;
- JPEGImage := TJPEGImage.Create;
- JPEGImage.Assign(Bitmap);
- JPEGImage.CompressionQuality := 100-Compression;
- JPEGImage.SaveToFile(FN3);
- {$IfDef HELIOS_CONSOLE}
- Cons.AddMsg('Saved Screenshot ' + extractfilename(FN3));
- {$EndIf}
- Bitmap.Free;
- JPEGImage.Free;
- end;
- // =============================================================================
- // glSaveScreen
- // =============================================================================
- // Speichert einen Screenshot des aktuellen Pufferinhaltes
- // =============================================================================
- // A Modifyed version of Son Of Satan's glSaveScreen
- function ScreenShot_BitmapResult : TBitmap;
- var
- Viewport : array[0..3] of TGLint;
- 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);
- 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.rgbRed;
- Pixel.rgbRed := Pixel.rgbBlue;
- Pixel.rgbBlue := Temp;
- inc(Pixel);
- end;
- SetDIBits(Bmp.Canvas.Handle, Bmp.Handle, 0, Viewport[3], RGBBits, TBitmapInfo(Header^), DIB_RGB_COLORS);
- FreeMem(Header);
- FreeMem(RGBBits);
- Result := BMP;
- end;