Screen capture

How could I capture screen from my opengl program. The captured screen should be in .bmp mode. Is there some easy/short way doing it?

I think you need to include
#include <mmsystem.h>

usage call

screenshot(int startx, int starty, int width, int height, const char *fname)

example:
screenshot(0,0,1024,768,“screenshot.bmp”);

i got the source code which had to be modified from elsewhere on this board.

int write_screenshot_bmp(const char *fname, const unsigned char *image, int w, int h)
{
BITMAPFILEHEADER header;

struct BMPInfo {
	unsigned int size;
	unsigned int width;
	unsigned int height;
	unsigned short planes;
	unsigned short bit_count;
	unsigned int comp;
	unsigned int sizeImage;
	unsigned int x_pels_per_meter;
	unsigned int y_pels_per_meter;
	unsigned int clr_used;
	unsigned int clr_important;
} info; //__attribute__((packed)) info;

FILE *fp;
int ret = 0;
fp = fopen(fname, "wb");
if (!fp) {
	// unable to open file for writing
	ret = -1;
}
else{
    header.bfType = 'MB';
    header.bfSize = sizeof(header) + sizeof(info) + w * h * 3;;
    header.bfReserved1 = 0;
    header.bfReserved2 = 0;
    header.bfOffBits = sizeof(header) + sizeof(info);
	info.size = sizeof(info);
	info.width = w;
	info.height = h;
	info.planes = 1;
	info.bit_count = 24;
	info.comp = 0;
	info.sizeImage = w * h * 3;
	info.x_pels_per_meter = info.y_pels_per_meter = 0;
	info.clr_used = 0;
	info.clr_important = 0;
	fwrite(&header, sizeof(header), 1, fp);
	fwrite(&info, sizeof(info), 1, fp);

	fwrite(image, sizeof(unsigned char), h*w*3, fp);
}
if (fp){
	fclose(fp);
}
return ret;

}

int screenshot(int x, int y, int width, int height, const char *fname)
{
unsigned char *image = NULL;
int ret = 0;

// reserve some mem
image = (unsigned char*)malloc(sizeof(unsigned char)*width*height*3);
if (!image){
	// unable to allocate image buffer
	ret = -1;
}

else{
		glReadPixels(x,y,width,height, GL_BGR_EXT, GL_UNSIGNED_BYTE, image);
		ret = write_screenshot_bmp(fname, image, width, height);
}

if (image) {
	free(image);
}

return ret;

}

Wow… that source looks familiar… ahem

If it is mine, I’d like to point out that that source is GPLed… please respect my copyright and choice of license. Thanks.

[This message has been edited by rts (edited 04-07-2001).]

Originally posted by dans:
i got the source code which had to be modified from elsewhere on this board

Thanks, but if my program runs in 32bit mode should I do any changes to it? That code ins’t as short as I expected. You can load bmp-file easily with LoadImage function, but there isn’t any function which would save hdc to bmp-file or something like that???

I made some changes to code…

void CaptureScreen( int Width, int Height )
{
BITMAPFILEHEADER bf;
BITMAPINFOHEADER bi;

unsigned char image = (unsigned char)malloc(sizeof(unsigned char)WidthHeight*3);
FILE *file = fopen(“capture.bmp”, “wb”);

if( image!=NULL )
{
if( file!=NULL )
{
glReadPixels( 0, 0, Width, Height, GL_BGR_EXT, GL_UNSIGNED_BYTE, image );

memset( &bf, 0, sizeof( bf ) );
memset( &bi, 0, sizeof( bi ) );

bf.bfType = ‘MB’;
bf.bfSize = sizeof(bf)+sizeof(bi)+WidthHeight3;
bf.bfOffBits = sizeof(bf)+sizeof(bi);
bi.biSize = sizeof(bi);
bi.biWidth = Width;
bi.biHeight = Height;
bi.biPlanes = 1;
bi.biBitCount = 24;
bi.biSizeImage = WidthHeight3;

fwrite( &bf, sizeof(bf), 1, file );
fwrite( &bi, sizeof(bi), 1, file );
fwrite( image, sizeof(unsigned char), HeightWidth3, file );

fclose( file );
}
free( image );
}
}

Source code to my library, currently running in Linux but should run anywhere, is available at:
http://richardson.dl.stevens-tech.edu/dov/SDV