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;