All pastes #417339 Raw Edit

Untitled

public cpp v1 · immutable
#417339 ·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();}