Ir al contenido


Foto

Ayuda con funcion para capturar pantalla


  • Por favor identifícate para responder
2 respuestas en este tema

#1 omar73rnr

omar73rnr

    Member

  • Miembros
  • PipPip
  • 10 mensajes

Escrito 13 diciembre 2011 - 02:50

Creo que mi pregunta va en esta seccion del foro,, de no ser asi que algun moderador mueva el hilo al lugar correcto.
Bueno,, hace unn tiempo atras pedi ayuda para hacer un programa que capture imagenes de juegos que utilizan opengl,, en Windows 7,, que por defecto hacia capturas en negro y con el portapapeles también.
Buscando info en internet encontre que podia hacer las capturas de pantalla mediante la funcion glreadpixels,, mas especificamente esto,, en unn foro aleman. En la wiki de ese foro tambien encontré esto.
Esta info me fue de mucha ayuda para poder hacer el programa,, pero ahora tengo otro problema,, el programa compila y ejecuta perfecto,, solo que cuando presiono el boton asignado para hacer la captura me devuelve el siguiente error: "Access violation at address 00000000. Read of address 00000000"
El código que tengo es este:


delphi
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, OpenGL12, StdCtrls;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     Button1: TButton;
  12.     procedure Button1Click(Sender: TObject);
  13.     procedure ScreenShot(const Name : string);
  14.   private
  15.     { Private declarations }
  16.   public
  17.     { Public declarations }
  18.   end;
  19.  
  20. type BITMAPFILEHEADER = packed record
  21.     bfType: Word;
  22.     bfSize: DWORD;
  23.     bfReserved1: Word;
  24.     bfReserved2: Word;
  25.     bfOffBits: DWORD;
  26.   end;
  27.  
  28. type BITMAPINFOHEADER = packed record
  29.     biSize: DWORD;
  30.     biWidth: Longint;
  31.     biHeight: Longint;
  32.     biPlanes: Word;
  33.     biBitCount: Word;
  34.     biCompression: DWORD;
  35.     biSizeImage: DWORD;
  36.     biXPelsPerMeter: Longint;
  37.     biYPelsPerMeter: Longint;
  38.     biClrUsed: DWORD;
  39.     biClrImportant: DWORD;
  40.   end;
  41.  
  42. var
  43.   Form1: TForm1;
  44.  
  45. implementation
  46.  
  47. {$R *.dfm}
  48.  
  49. procedure TForm1.ScreenShot(const Name : string); //by delphigl
  50. var F : file;
  51.     FileInfo: BITMAPINFOHEADER;
  52.     FileHeader : BITMAPFILEHEADER;
  53.     pPicData:Pointer;
  54.     Viewport : array[0..3] of integer;
  55. begin
  56.  
  57. ZeroMemory(@FileHeader, SizeOf(BITMAPFILEHEADER));
  58. ZeroMemory(@FileInfo, SizeOf(BITMAPINFOHEADER));
  59.  
  60. glGetIntegerv(GL_VIEWPORT, @Viewport);
  61.  
  62. FileHeader.bfType := 19778; //$4D42 = 'BM'
  63. FileHeader.bfOffBits := SizeOf(BITMAPINFOHEADER)+SizeOf(BITMAPFILEHEADER);
  64.  
  65. FileInfo.biSize := SizeOf(BITMAPINFOHEADER);
  66. FileInfo.biWidth := Viewport[2];
  67. FileInfo.biHeight := Viewport[3];
  68. FileInfo.biPlanes := 1;
  69. FileInfo.biBitCount := 32;
  70. FileInfo.biSizeImage := FileInfo.biWidth*FileInfo.biHeight*(FileInfo.biBitCount div 8);
  71.  
  72. FileHeader.bfSize := FileHeader.bfOffBits + FileInfo.biSizeImage;
  73.  
  74. GetMem(pPicData, FileInfo.biSizeImage);
  75. try
  76.  
  77.   glReadPixels(0, 0, Viewport[2], Viewport[3], GL_BGRA, GL_UNSIGNED_BYTE, pPicData);
  78.  
  79.   AssignFile(f, name);
  80.   Rewrite( f,1 );
  81.   try
  82.   BlockWrite(F, FileHeader, SizeOf(BITMAPFILEHEADER));
  83.   BlockWrite(F, FileInfo, SizeOf(BITMAPINFOHEADER));
  84.   BlockWrite(F, pPicData^, FileInfo.biSizeImage );
  85.   finally
  86.   CloseFile(f);
  87.   end;
  88. finally
  89.  
  90.   FreeMem(pPicData, FileInfo.biSizeImage);
  91. end;
  92. end;
  93.  
  94. procedure TForm1.Button1Click(Sender: TObject);
  95. begin
  96.       ScreenShot('prueba.bmp');
  97. end;
  98.  
  99. end.

Supongo que es un error provocado por un sector de la memoria que no se pudo usar.
Espero me puedan ayudar para poder terminar este proyecto que tengo desde hace ya unos meses.
Saludos
  • 0

#2 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 14 diciembre 2011 - 07:52

¿Has hecho la prueba en modo debug, para ver en qué línea salta el fallo?

Sin esa información, es buscar una aguja en un pajar.
  • 0

#3 omar73rnr

omar73rnr

    Member

  • Miembros
  • PipPip
  • 10 mensajes

Escrito 08 enero 2012 - 12:50

Disculpa por tanta demora para contestar,, es que tenia la pc en servicio tecnico y demoraron mucho para devolvermela :s
Bueno por lo que habia preguntado,, no,, no pense en hacer eso porque no estaba seguro si era por problema de codigo o que. Igualmente lo que paso fue que estaba usando una unit de opengl de una version antigua,, busque,, y encontre esto que corresponde a la ultima version. Usando esa unit ya no tube error de escritura de memoria y el programa funciona pero todavia persiste el problema de que las capturas aparecen en negro. Buscando un poco mas de informacion encontre como funciona fraps y por lo visto utiliza mas funciones aparte de glreadpixels. Creo que si sigo buscando informacion y leyendo podre terminar de hacer mi programa, cualquier avance que haga lo publicare. Gracias por la ayuda
  • 0




IP.Board spam blocked by CleanTalk.