Autor Beitrag
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Di 24.05.05 15:28 
hallo :D

ich habe ein opengl screen auf einem panel, jetzt möchte ich den inhalt des opengl bildschirms in eine datei speichern, nur wie mache ich den screenshot ?
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Di 24.05.05 18:40 
Erzeuge im Speicher ein TBitmap der Größe des Panels und kopiere dorthinein mit dem Befehl BitBlt das Bild des Panels.

Als Quell-Handle für diesen Befehl verwendest Du den DC, den Du auch an OpenGL übergeben hast.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
F34r0fTh3D4rk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Di 24.05.05 18:41 
jo werde ich versuchen, danke 8)
F34r0fTh3D4rk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Di 24.05.05 18:48 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TMainForm.Button1Click(Sender: TObject);
var
  Screenshot: TBitmap;
begin
  Screenshot := TBitmap.Create;
  try
    Screenshot.Width := Preview.Width;
    Screenshot.Height := Preview.Height;
    BitBlt(Screenshot.Canvas.Handle, 00, Screenshot.Width, Screenshot.Height, DC, 00, SRCCOPY);
    Screenshot.savetofile('C:\Test.bmp');
  finally
    Screenshot.Free;
  end;  
end;

im oncreate:
ausblenden Delphi-Quelltext
1:
  DC := GetDC(Preview.Handle);					


EDIT: Funzt wunderbar, DANKE :mrgreen:
F34r0fTh3D4rk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Di 24.05.05 19:15 
Problem: Machmal (Oft) ist das Bild nur Weiß, weil in dem Moment gerade der OpenDialog kam und in dem Frame kein Bild gerendert wurde :(
(im onidle gehts auch net (dachte an synchronisation, aber da ist ja auch wieder der savedialog) das läuft auf nichts elegantes hinaus...

Es gibt aber eine OpenGL Funktion dafür, aber wie man die darauf anwendet weiß ich net :?
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mi 25.05.05 11:38 
Ich glaub, du meinst SwapBuffers ??? Einfach kurz aufrufen (vor dem BitBlt), dann sollte es gehen.

Sofern Du DoubleBuffering aktiv hast, was ich mal hoffe ^^

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
F34r0fTh3D4rk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Mi 25.05.05 14:54 
so gehts:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
procedure GLScreenShot_BMP_1(name : string);
var
  F : file;
  FileInfo: BITMAPINFOHEADER;
  FileHeader : BITMAPFILEHEADER;
  pPicData:Pointer;
  Viewport : array[0..3of integer;
begin
  ZeroMemory(@FileHeader, SizeOf(BITMAPFILEHEADER));
  ZeroMemory(@FileInfo, SizeOf(BITMAPINFOHEADER));
  glGetIntegerv(GL_VIEWPORT, @Viewport);
  FileInfo.biSize := SizeOf(BITMAPINFOHEADER);
  FileInfo.biWidth := Viewport[2];
  FileInfo.biHeight := Viewport[3];
  FileInfo.biPlanes := 1;
  FileInfo.biBitCount := 32;
  FileInfo.biSizeImage := FileInfo.biWidth*FileInfo.biHeight*(FileInfo.biBitCount);
  FileHeader.bfType := 19778;
  FileHeader.bfOffBits := SizeOf(BITMAPINFOHEADER)+SizeOf(BITMAPFILEHEADER);
  GetMem(pPicData, FileInfo.biSizeImage);
  glReadPixels(00, Viewport[2], Viewport[3], GL_BGRA, GL_UNSIGNED_BYTE, pPicData);
  AssignFile(f, name);
  Rewrite( f,1 );
  BlockWrite(F, FileHeader, SizeOf(BITMAPFILEHEADER));
  BlockWrite(F, FileInfo, SizeOf(BITMAPINFOHEADER));
  BlockWrite(F, pPicData^, FileInfo.biSizeImage );
  CloseFile(f);
  FreeMem(pPicData, FileInfo.biSizeImage);
end;

:D