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:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, OpenGL12, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); procedure ScreenShot(const Name : string); private { Private declarations } public { Public declarations } end; type BITMAPFILEHEADER = packed record bfType: Word; bfSize: DWORD; bfReserved1: Word; bfReserved2: Word; bfOffBits: DWORD; end; type BITMAPINFOHEADER = packed record biSize: DWORD; biWidth: Longint; biHeight: Longint; biPlanes: Word; biBitCount: Word; biCompression: DWORD; biSizeImage: DWORD; biXPelsPerMeter: Longint; biYPelsPerMeter: Longint; biClrUsed: DWORD; biClrImportant: DWORD; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.ScreenShot(const Name : string); //by delphigl var F : file; FileInfo: BITMAPINFOHEADER; FileHeader : BITMAPFILEHEADER; pPicData:Pointer; Viewport : array[0..3] of integer; begin ZeroMemory(@FileHeader, SizeOf(BITMAPFILEHEADER)); ZeroMemory(@FileInfo, SizeOf(BITMAPINFOHEADER)); glGetIntegerv(GL_VIEWPORT, @Viewport); FileHeader.bfType := 19778; //$4D42 = 'BM' FileHeader.bfOffBits := SizeOf(BITMAPINFOHEADER)+SizeOf(BITMAPFILEHEADER); 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 div 8); FileHeader.bfSize := FileHeader.bfOffBits + FileInfo.biSizeImage; GetMem(pPicData, FileInfo.biSizeImage); try glReadPixels(0, 0, Viewport[2], Viewport[3], GL_BGRA, GL_UNSIGNED_BYTE, pPicData); AssignFile(f, name); Rewrite( f,1 ); try BlockWrite(F, FileHeader, SizeOf(BITMAPFILEHEADER)); BlockWrite(F, FileInfo, SizeOf(BITMAPINFOHEADER)); BlockWrite(F, pPicData^, FileInfo.biSizeImage ); finally CloseFile(f); end; finally FreeMem(pPicData, FileInfo.biSizeImage); end; end; procedure TForm1.Button1Click(Sender: TObject); begin ScreenShot('prueba.bmp'); end; 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