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