Screen capture

Started by
3 comments, last by Whitehair 21 years, 3 months ago
hi everyone, I am thinking of doing a screen capture program, where the captured data can be saved as file or saved in memory. (using OpenGL or VC++) Could anyone enlighten me on how or what to start with? Thank you. Merry Christmas to all!
Advertisement
I wish i knew that also. MY only guess would be to render to a texture, then somehow write the texture to a file.
Jeff Bland (Reverse_Gecko)reversegecko@gmail.com
This thread has working (windows) code to save the entire screen as a .bmp.
You have to fix a couple typos, and I guess it''s no good if you aren''t using windows/aren''t in fullscreen and only want the OpenGL window, but it works well for me.

------------
MSN: nmaster42@hotmail.com, AIM: LockePick42, ICQ: 74128155
"It''s all part of the conspiracy of conspirators conspiring to conspire their own conspiracies..."
_______________________________________Pixelante Game Studios - Fowl Language
Thanks.
I''ll see if i can alter it to capture active window only.

After Christmas

I have added screen capture function into my program.
Bitmap is rather big file to save as screenshots files...
Anyway, thought all who are interested and have had given me help would like to see the codes that I use to add screen capture
into my program.

int WriteBMP(char *file, int width, int height, unsigned char *image)
{
// 3 parts of bmp, the info header, the file header, and the image.
// Write each one.

FILE *pFile; // file pointer.
BITMAPINFOHEADER infoHeader; // info header.
BITMAPFILEHEADER fileHeader; // file header.
int index; // index for the for loop.
unsigned char tempColors; // Use to change image from RGB to BGR.

pFile = fopen(file, "wb"); // Open the file for write.

if(!pFile) { return 0; }

// Define whats going in the infoHeader.
infoHeader.biSize = sizeof(BITMAPINFOHEADER);
infoHeader.biPlanes = 1;
infoHeader.biBitCount = 24;
infoHeader.biCompression = BI_RGB;
infoHeader.biSizeImage = width * abs(height) * 3;
infoHeader.biXPelsPerMeter = 0;
infoHeader.biYPelsPerMeter = 0;
infoHeader.biClrUsed = 0;
infoHeader.biClrImportant = 0;
infoHeader.biWidth = width;
infoHeader.biHeight = height;

// Define whats going in the file header.
fileHeader.bfSize = sizeof(BITMAPFILEHEADER);
fileHeader.bfType = 0x4D42;
fileHeader.bfReserved1 = 0;
fileHeader.bfReserved2 = 0;
fileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);


// Change image from RGB to BGR. Thats how .bmp is saved.
for(index = 0; index < infoHeader.biSizeImage; index += 3)
{
tempColors = image[index];
image[index] = image[index + 2];
image[index + 2] = tempColors;
}

// Write to the file.
// Write file header.
fwrite(&fileHeader, 1, sizeof(BITMAPFILEHEADER), pFile);

// Write info header.
fwrite(&infoHeader, 1, sizeof(BITMAPINFOHEADER), pFile);

// Write image.
fwrite(image, 1, infoHeader.biSizeImage, pFile);

// Close the file.
fclose(pFile);
}

void SaveBMP()
{ char tring[32];
GLubyte *outputImage ;
// Allocate the neccessary memory.
outputImage = (unsigned char*)malloc(width * height * 3);

// Clear the variable.
memset(outputImage, 0, width * height * 3);

// glReadPixels() to read every pixel on the screen
// that you specify. You must use one less than each size.
glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, outputImage);

sprintf(tring,"%d.bmp",count);

// Call WriteBMP() function to write the bmp.
WriteBMP(tring, width, height, (unsigned char*)outputImage);

// Clear the allocated memory.
free(outputImage);
count +=1;
}

This topic is closed to new replies.

Advertisement