Skip to content

Instantly share code, notes, and snippets.

@wridgers
Created December 13, 2012 16:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save wridgers/4277600 to your computer and use it in GitHub Desktop.
Save wridgers/4277600 to your computer and use it in GitHub Desktop.
Writes a BMP format file.
void Tracer::writeScreenToBmp()
{
// short == 2 bytes
// int == 4 bytes
struct BitMapFileHeader
{
short magic;
int size;
short reserved1;
short reserved2;
int offbits;
};
struct BitMapInfoHeader
{
int size;
int width;
int height;
short planes;
short bitCount;
int compression;
int sizeImage;
int xPixelsPerMeter;
int yPixelsPerMeter;
int clrUsed;
int clrImportant;
};
struct BitMapFileHeader header;
struct BitMapInfoHeader info;
// magic bytes
int extraBytes = (4 - (renderWidth * 3) % 4) % 4; // each row must be multiple of four
int imageBufferSize = (renderWidth * 3 + extraBytes) * renderHeight;
header.magic = 0x4d42;
header.size = 14 + 40 + imageBufferSize;
header.reserved1 = 0;
header.reserved2 = 0;
header.offbits = 14 + 40;
info.size = 40;
info.width = renderWidth;
info.height = renderHeight;
info.planes = 1;
info.bitCount = 24;
info.compression = 0;
info.sizeImage = imageBufferSize;
info.xPixelsPerMeter = 2952;
info.yPixelsPerMeter = 2952;
info.clrUsed = 0;
info.clrImportant = 0;
char *imageBuffer = new char[imageBufferSize];
// zero everything
for (int i = 0; i < imageBufferSize; ++i)
imageBuffer[i] = 0x00;
for (int i = 0; i < screenSize; ++i ) {
int x = i % renderWidth;
int y = (i - x) / renderWidth;
// use x and y to find offset n
int n = (renderHeight - 1 - y) * (renderWidth * 3 + extraBytes) + (x * 3);
imageBuffer[n] = (char)screen[i].blue;
imageBuffer[n+1] = (char)screen[i].green;
imageBuffer[n+2] = (char)screen[i].red;
}
// write to file
ofstream outputFile("image.bmp", ios::binary);
// file header
outputFile.write((char*)&header.magic, sizeof(header.magic));
outputFile.write((char*)&header.size, sizeof(header.size));
outputFile.write((char*)&header.reserved1, sizeof(header.reserved1));
outputFile.write((char*)&header.reserved2, sizeof(header.reserved2));
outputFile.write((char*)&header.offbits, sizeof(header.offbits));
// info header and imageBuffer
outputFile.write((char*)&info, sizeof(info));
outputFile.write(imageBuffer, imageBufferSize);
outputFile.close();
// clean up
delete [] imageBuffer;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment