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();}