All pastes #417338 Raw Edit

Someone

public text v1 · immutable
#417338 ·published 2007-03-30 20:34 UTC
rendered paste body
#include "BMP_Image.h"

#include <fstream>



using namespace std;



BMP_Image::BMP_Image(std::string& str) {

	ifstream ifile;

	ifile.open(str.c_str(), ios::in | ios::binary);

	

	//read file header

	ifile.read((char *)(&fh.bfType), sizeof(word));

	ifile.read((char *)(&fh.bfSize), sizeof(dword));

	ifile.read((char *)(&fh.bfReserved1), sizeof(word));

	ifile.read((char *)(&fh.bfReserved2), sizeof(word));

	ifile.read((char *)(&fh.bfOffBits), sizeof(dword));



	//read info header

	ifile.read((char *)(&ih.biSize), sizeof(dword));

	ifile.read((char *)(&ih.biWidth), sizeof(dword));

	ifile.read((char *)(&ih.biHeight), sizeof(dword));

	ifile.read((char *)(&ih.biPlanes), sizeof(word));

	ifile.read((char *)(&ih.biBitCount), sizeof(word));

	ifile.read((char *)(&ih.biCompression), sizeof(dword));

	ifile.read((char *)(&ih.biSizeImage), sizeof(dword));

	ifile.read((char *)(&ih.biXpelsPerMeter), sizeof(dword));

	ifile.read((char *)(&ih.biYpelsPerMeter), sizeof(dword));

	ifile.read((char *)(&ih.biClrUsed), sizeof(dword));

	ifile.read((char *)(&ih.biClrImportant), sizeof(dword));



	//24 bits bitmaps don't have a palette.



	//read image data

	image = new Pixel*[ih.biHeight];

	

	//calculate line length in bytes.

	int padding = (4 - ((ih.biWidth * 3) % 4)) % 4; //32-bits aligned, number of bytes padded



	ifile.seekg(fh.bfOffBits);



	byte red, green, blue;

	for (unsigned int i = 0; i < ih.biHeight; i++) { //read image data in lines

		image[i] = new Pixel[ih.biWidth];

		for (unsigned int j = 0; j < ih.biWidth; j++) {

			ifile.read((char *)(&blue), sizeof(byte)); 		

			ifile.read((char *)(&green), sizeof(byte)); 		

			ifile.read((char *)(&red), sizeof(byte));

			

			image[i][j].setColor(red, green, blue);

		}

		ifile.seekg(padding, ios_base::cur); //skip the padded bytes

	}

	

	ifile.close();

}



BMP_Image::~BMP_Image() {

}



long BMP_Image::getWidth() { return ih.biWidth; }

long BMP_Image::getHeight() { return ih.biHeight; }

void BMP_Image::drawPixel(Pixel p, long Xpos, long Ypos) { image[Ypos][Xpos].setColor(p.getRed(), p.getGreen(), p.getBlue()); }

Pixel BMP_Image::getPixel(long Xpos, long Ypos) { return image[Ypos][Xpos]; }



void BMP_Image::writeToFile(std::string& str) {

	ofstream ofile;

	ofile.open(str.c_str(), ios::out | ios::binary);

	//write file header

	ofile.write((char *)(&fh.bfType), sizeof(word));

	ofile.write((char *)(&fh.bfSize), sizeof(dword));

	ofile.write((char *)(&fh.bfReserved1), sizeof(word));

	ofile.write((char *)(&fh.bfReserved2), sizeof(word));

	ofile.write((char *)(&fh.bfOffBits), sizeof(dword));



	//write info header

	ofile.write((char *)(&ih.biSize), sizeof(dword));

	ofile.write((char *)(&ih.biWidth), sizeof(dword));

	ofile.write((char *)(&ih.biHeight), sizeof(dword));

	ofile.write((char *)(&ih.biPlanes), sizeof(word));

	ofile.write((char *)(&ih.biBitCount), sizeof(word));

	ofile.write((char *)(&ih.biCompression), sizeof(dword));

	ofile.write((char *)(&ih.biSizeImage), sizeof(dword));

	ofile.write((char *)(&ih.biXpelsPerMeter), sizeof(dword));

	ofile.write((char *)(&ih.biYpelsPerMeter), sizeof(dword));

	ofile.write((char *)(&ih.biClrUsed), sizeof(dword));

	ofile.write((char *)(&ih.biClrImportant), sizeof(dword));



	//write image data

	int padding = (4 - ((ih.biWidth * 3) % 4)) % 4; //32-bits aligned, number of bytes padded

	ofile.seekp(fh.bfOffBits);

	

	Pixel cp;

	byte tmp;

	for (unsigned int i = 0; i < ih.biHeight; i++) {

		for (unsigned int j = 0; j < ih.biWidth; j++) {

			cp = image[i][j];

			tmp = cp.getBlue();

			ofile.write((char *)(&tmp), sizeof(byte)); 		

			tmp = cp.getGreen();

			ofile.write((char *)(&tmp), sizeof(byte)); 		

			tmp = cp.getRed();

			ofile.write((char *)(&tmp), sizeof(byte));

		}

		ofile.seekp(padding, ios_base::cur); //skip the padded bytes

	}

	

	ofile.close();

}